经典面试题:从数组中找出出现次数大于一半的数字

问题

  面试中经常会遇到这样的问题,给定一个数组,找出该数组中出现次数大于一半的数字,并且返回。

实现办法

    摩尔投票法,每次从序列里选择两个不同的数字删除掉(可以理解为抵消),最后剩下一个数字或者相同的数字就是出现次数大于一半的那一个。其实大致就能理解为,一直在删除、删除、删除直到不能删除为止,就是我们想要的结果。

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;
}

总结

  其实摩尔投票法说白了核心就是对拼消耗,就相当于玩一个诸侯争霸的游戏,假设你方的兵力超过对方总兵力一半以上,然后每个兵出去干仗都可以与对方一对一同归于尽,最后还有兵力活下来的国家胜利。那就其实是大混战呗,只要你们不内斗,最后肯定你赢,最后剩下的就是结果了。

posted @ 2020-06-28 18:18  不进腾讯不改名  阅读(455)  评论(0)    收藏  举报