解答
1 方法1:对ID排序后,搜索出现次数最多的。
2 方法2:对ID排序后,返回第N/2项。
public static int Find1(int[] list){
Arrays.sort(list);
return list[list.length/2];
}
3 方法3:很不错的方法。每次删除不同的两个ID,最后剩下的ID肯定是超过一半的。动态规划+记录的方法。
public static int Find2(int[] list){
int ans=0;
int times=0;
for(int i=0;i<list.length;i++){
if(times==0){
ans = list[i];
times ++;
}
else{
if(ans == list[i]){
times++;
}
else{
times--;
}
}
}
return ans;
}
扩展题:这才是真正考察是否学会这道题目的思路。需要三个变量。情况为:如果和其中一个槽位数据相等,那么这个槽位+1;如果有空槽位,那么把新的数据放入;如果都不相等且没空槽位,那么所有槽位都-1;
public static int[] Find3(int[] list){
int[] ans = new int[3];
ans[1]=Integer.MIN_VALUE;
ans[2]=Integer.MIN_VALUE;
ans[0]=Integer.MIN_VALUE;
int[] times = new int[3];
if(list.length<3){
return ans;
}
for(int i=0;i<list.length;i++){
int cur = list[i];
if(cur == ans[0]){
times[0]++;
}
else if(cur == ans[1]){
times[1]++;
}
else if(cur == ans[2]){
times[2]++;
}
else if(times[0]==0){
ans[0]=cur;
times[0]=1;
}
else if(times[1]==0){
ans[1]=cur;
times[1]=1;
}
else if(times[2]==0){
ans[2]=cur;
times[2]=1;
}
else {
times[0]--;
times[1]--;
times[2]--;
}
}
return ans;
}