经典面试题:从数组中找出出现次数大于一半的数字
问题
面试中经常会遇到这样的问题,给定一个数组,找出该数组中出现次数大于一半的数字,并且返回。
实现办法
摩尔投票法,每次从序列里选择两个不同的数字删除掉(可以理解为抵消),最后剩下一个数字或者相同的数字就是出现次数大于一半的那一个。其实大致就能理解为,一直在删除、删除、删除直到不能删除为止,就是我们想要的结果。
function majorityString() { $arr = [1, 6, 6, 4, 9, 2, 5, 6, 6, 3]; $count = 1; //默认出现次数为1次 $flag = $arr[0]; //需要找到的字符 for ($i = 1; $i < count($arr); $i++) { //当两者相等时次数+1 if ($arr[$i] == $flag) { $count++; } else { $count--; } //这个时候已经找不到了,这就是想要的结果 if ($count == 0) { $count = 1; $flag = $arr[$i]; } } return $flag; }
总结
其实摩尔投票法说白了核心就是对拼消耗,就相当于玩一个诸侯争霸的游戏,假设你方的兵力超过对方总兵力一半以上,然后每个兵出去干仗都可以与对方一对一同归于尽,最后还有兵力活下来的国家胜利。那就其实是大混战呗,只要你们不内斗,最后肯定你赢,最后剩下的就是结果了。

浙公网安备 33010602011771号