您的位置:首页 > 职场人生

九章算法面试题14 超过一半的数

2015-05-12 13:31 267 查看

九章算法官网-原文网址

http://www.jiuzhang.com/problem/14/

题目

初阶:有N个数,其中一个数的出现次数严格超过了一半。求这个数。

进阶1:有N个数,其中两个数的出现次数都超过了⅓ ,求这两个数。

进阶2:有N个数,其中一个数的出现次数严格超过了⅓,并且没有第二个这样的数。求这个数。

以上两问均要求O(n)的时间复杂度和O(1)的额外空间复杂度。

解答

初阶:抵消法。如果两个数不一样,扔掉这两个数,剩下来的数中,要找的数的出现次数仍然会超过一半。所以整个过程中只需要保存一个数,及其出现次数即可。

进阶1:仍然是抵消法。如果三个数不一样,就三个数都扔掉。因此记录2个数,及其各自出现次数即可。

进阶2:沿用进阶1的算法。如果最后剩下1个数,那么就是答案了;如果剩下2个数,重新扫描这N个数,统计这两个数的出现次数则可以得到答案。



面试官角度

初阶问题是著名的芯片测试问题的另一个版本。一般来讲大学的算法课上都会讲到。主要考察的是算法基本功底。进阶1和进阶2都是需要想办法利用初阶问题的思路去解决,如果只是背下了初阶问题的解答没有真正理解,进阶问题就无法回答出来。进阶2在回答的时候需要和面试官沟通是否可以再扫描一遍数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: