日期:2014-05-20  浏览次数:20667 次

数组面试题: 今天去面试不会啊 郁闷 大哥们帮解决一下
一个数组,“支配者”是在数组中出现频率超过一半的整数,
例如[3,4,3,2,-1,3,3,3]数值“3”出现过5次,5除以8大于0.5
所以数值“3”是一个支配者;
而在这个数组中的支配者出现在数组下标[0,2,4,6,7]
写一个函数,在给定的整数数组中找出支配者所在的任意一个数组下标,如果一个数组中没有支配者返回-1;

------解决方案--------------------
import java.util.Arrays;

public class Test {
public static void main(String... strings) {
int[] arr = {3,4,3,2,-1,3,3,3};
int s = search(arr);
if(s == -1){
System.out.println("没有支配者!");
}else{
System.out.println("支配者:"+s);
System.out.println("支配者所在数组下标:");
for(int i = 0;i<arr.length;i++){
if(arr[i] == s){
System.out.print(i+" ");
}
}
}
}

public static int search(int[] a){
int count = 1;
int[] arr = new int[a.length];
for(int i=0;i<a.length;i++){
arr[i]=a[i];
}
Arrays.sort(arr);
for(int i=1;i<arr.length;i++){
if(arr[i] == arr[i-1]){
count++;
if(count>arr.length*0.5){
return arr[i-1];
}
}else{
count = 1;
}
}
return -1;
}
}
------解决方案--------------------
Java code
public class Test {

    public static void main(String[] args) {
        int[] array = {3,4,3,2,-1,3,3,3}; 
        List<Integer> list = search(array);
        for(Integer i:list){
            System.out.print(i+"  ");
        }
    }
    
    public static List<Integer> search(int[] array){
        Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
        for(int i=0;i<array.length;i++){
            //添加出现者和其出现位置
            if(map.containsKey(array[i])){
                map.get(array[i]).add(i);
            }else{
                List<Integer> list = new ArrayList<Integer>();
                list.add(i);
                map.put(array[i], list);
            }
        }
        for(Integer i:map.keySet()){
            double percent = (double)map.get(i).size()/(double)array.length;
            if(percent>0.5){
                return map.get(i);
            }
        }
        //如果一个数组中没有支配者返回-1
        List<Integer> list = new ArrayList<Integer>();
        list.add(-1);
        return list;
    }
}