题目要求:

UNIN队设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

分析:其实第一次考虑的时候想的是既然超过了一半,那就直接排序,那在中间的肯定就是水王。但是老师说如果是数据很大,那么排序就要耗费很长的时间。所以此法在数据少的情况下可行,但是多起来效率就很低。在老师提醒下:既然超过了一半,那么两两id进行对比,如果相同则保留一个,如果不同则全部删除,因为水王超过一半所以最后剩下的就是水王,水王不怕删,删到最后剩下来的肯定是水王。

 

代码:

public class Test {
    public static void main(String[] args) {
        int[] id = {1,2,3,4,56,22,11,1,1,1,1,1,1,12,8,7,65,4,1,1,1,1};
        System.out.println("水王为:"+findT(id,id.length));
    }

    public static int find(int[] id,int length){
        int king = 0;
        int num = 0;
        for (int i=0;i<length;i++){
            if (num==0){
                king = id[i];
                num++;
            }else if(king==id[i]){
                num++;
            }else if (king!=id[i]){
                num--;
            }
        }
        return king;
    }
}

 

老师说这是很早之前的微软面试题,发现题目虽然很简单,但是方法并不是那么好想出来,主要是发现规律以及抓住题目字眼,而且要将复杂度降到最低,因此需要想一想。发现水王id超过一半,不用排序,水王最不怕删所以上面的方法简单。可见面试题不是很高大上,但是一定会让你的脑筋转的小题,要多多的积累这方面的经验,只有这样才能在以后的面试中脱颖而出。