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