自己开发的博客网站,欢迎访问https://www.weiboke.online
#137. Single Number II
Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,3,2]
Output: 3
Example 2:
Input: [0,1,0,1,0,1,99]
Output: 99
##Approach
- 题目大意就是找出只出现过一次的元素,其他元素出现三次。有三个解法,第一种解法就是用hashmap记录出现的次数,然后找出只出现一次的元素,但是这个不符合题意。第二种解法就是枚举32位,然后计算每位出现的次数是否能被3整除,如果不能整除,说明只出现过一次的这个位肯定在这里。第三种解法就是模拟三进制,把一位扩展成两位,逢三清零。
- 贴后两种解法,第一种解法过于简单,就不贴了。
##Code
Two
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < 32; i++) {
int cnt = 0, bit = 1 << i;
for (const int &n : nums) {
if (n&bit)cnt++;
}
if (cnt % 3)ans |= bit;
}
return ans;
}
};
Three
class Solution {
public:
int singleNumber(vector<int>& nums) {
int xthree = 0, ones = 0, twos = 0;
for (const int&n : nums) {
twos |= (ones&n);
ones ^= n;
xthree = ~(ones&twos);
ones &= xthree;
twos &= xthree;
}
return ones;
}
};