找水王

首先,这道测试的关键所在就是水王的发帖数目在一半以上,而且要只通过一次遍历,不能新定义数组开辟新的空间。

其次,我的思路也是上课同学给的思路吧,自己课下仔细研究了一下,第一次是通过多次遍历从而求出出现次数最对的元素,第二次才是对算法进行来了优化。

优化方法:既然水王的发帖数目在一半以上,也就是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)); } }

原文地址:https://www.cnblogs.com/qianmo123/p/10951752.html