首先,这道测试的关键所在就是水王的发帖数目在一半以上,而且要只通过一次遍历,不能新定义数组开辟新的空间。
其次,我的思路也是上课同学给的思路吧,自己课下仔细研究了一下,第一次是通过多次遍历从而求出出现次数最对的元素,第二次才是对算法进行来了优化。
优化方法:既然水王的发帖数目在一半以上,也就是ID出现的次数在一半以上,所以一定会有两个相邻且相同的ID,而只需一次遍历,将出ID相同次数最多的ID输出即可,通过一个变量记录出现的次数,如果后面的相同,则次数+1,否则-1,直到次数=0时需要从新开始计数,最后的返回值即水王的ID:
该测试的代码如下:
package text; public class Max { public void test1(int []arr,int n) //测试 { int max=count(arr, arr[0]); int num=0; for(int i=1;i<5;i++) { if(max<count(arr, arr[i])) { max=count(arr, arr[i]); num=i; } } System.out.println("水王ID为:"+arr[num]); } public int count( int []arr,int a) { int num=0; for(int i=0;i<arr.length;i++) { if(arr[i]==a) { num++; } } return num; } public int test2(int arr[],int n){ int answer=arr[0]; int num=1; for (int i=0;i<n;i++){ if (num==0){//如果前面都不对,更新为最新数字 answer=arr[i]; num=1; }else if (arr[i]==answer){//如果相等 num++; }else{//如果不相等 num--; } } return answer; } public static void main(String[] args) { int []arr= {1,1,2,3,1}; System.out.println("帖子ID为:"); for(int i=0;i<5;i++) { System.out.print(arr[i]+" "); } Max max=new Max();
System.out.println(); System.out.println("方法一:"); max.test1(arr,5); System.out.println("方法一:"); System.out.println("水王ID为:"+max.test2(arr,5)); } }