题目要求:
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超过一半,不用排序,水王最不怕删所以上面的方法简单。可见面试题不是很高大上,但是一定会让你的脑筋转的小题,要多多的积累这方面的经验,只有这样才能在以后的面试中脱颖而出。