剑指offer之数组中出现次数超过一半的数字(C++/Java双重实现)

1.题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
限制:
1 <= 数组长度 <= 50000

在这里插入图片描述

2.问题分析

给出输入[1,2,3,3,3],将这几个数字写成二进制数(整型32位,这里只写出后面4位)[0001, 0010, 0011, 0011, 0011]。在这4位二进制数字中。各自的最高位分别为[0,0,0,0],则最高位出现最多的数字是二进制0。同理,高二位出现最多的二进制数字为0,高三位出现最多的二进制数字为1,最低位出现最多的二进制数字为1。则4位出现最多的二进制数字拼起来为0011,值为3,即结果。
另外我们了解两个知识点:
1.<<优先级大于^
2.^在两个数的二进制^的结果里,相同得1不同得0

3.代码实现

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int ans = 0;
        int n = nums.size();
        for(int i=0; i < 32; i++){
            int cnt = 0;
            for(int n: nums){
                if(n & 1 << i) cnt ++;
            }
            if(cnt > n / 2)
             ans ^= 1 << i;//<<优先级大于^
        }
        return ans;
    }
};

3.2Java代码

class Solution {
    public int majorityElement(int[] nums) {
        int ans = 0;
        int n = nums.length;
        for(int i=0; i < 32; i++){
            int cnt = 0;
            for(int m:nums){
                if((m&1<<i)==1)
                cnt++;
            }
            if(cnt > n / 2) 
            ans^= 1 << i;
        }
        return ans;

    }
}

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107144917
今日推荐