19
06/2015
[LeetCode] Single Number II
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解题思路:
与Single Number不同,这里不能再用异或操作来做了。可以为每个位上1的数目计数。然后将该计数%3,剩下的1肯定是单独的数字贡献的。
class Solution { public: int singleNumber(vector<int>& nums) { vector<int> bitNumCount(32, 0); int len = nums.size(); for(int i=0; i<len; i++){ int num = nums[i]; for(int j = 0; j<32 && num!=0; j++){ if(num & 0x1 == 1){ bitNumCount[j]++; } num = num>>1; } } int result = 0; for(int i=31; i>=0; i--){ result = result<<1; if(bitNumCount[i]%3!=0){ result += 1; } } return result; } };
上面用了一个32位的向量。经过优化,还可以更为精简:
class Solution { public: int singleNumber(vector<int>& nums) { int result = 0; int len = nums.size(); for(int i=0; i<32; i++){ int count = 0; for(int j=0; j<len; j++){ count += (nums[j]>>i)&1; } result += (count%3)<<i; } return result; } };
转载请注明:康瑞部落 » [LeetCode] Single Number II
0 条评论