标签:leetcode 位运算 single number single numberii
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
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?
分析:
一个整形数组,除某个元素外,每个元素都出现了2次(Single NumberII中出现了3次),找出这个只出现一次的元素。要求,线性时间复杂度、不使用额外的空间。
Single Number 比较简单,由于其余元素都出现了两次,通过位运算中 N xor N = 0即可方便的找到这个只出现一次的元素。代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int length = nums.size();
int result = 0 ;
for (int i=0; i<length; i++)
{
result ^= nums[i];
}
return result;
}
};
Single Number II要复杂的多,很难直观的找到算法。考虑每个元素的为一个32位的二进制数,这样每一位上出现要么为1 ,要么为0。对数组,统计每一位上1 出现的次数count,必定是3N或者3N+1 次。让count对3取模,能够获得到那个只出现1次的元素该位是0还是1。
代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int length = nums.size();
int result = 0;
for(int i = 0; i<32; i++){
int count = 0;
int mask = 1<< i;
for(int j=0; j<length; j++){
if(nums[j] & mask)
count++;
}
<span style="color:#FF6666;"> if(count %3)</span>
result |= mask;
}
return result;
}
};class Solution {
public:
int singleNumber(vector<int>& nums) {
int length = nums.size();
int result = 0;
for(int i = 0; i<32; i++){
int count = 0;
int mask = 1<< i;
for(int j=0; j<length; j++){
if(nums[j] & mask)
count++;
}
<span style="color:#FF6666;"> if(count %2)</span>
result |= mask;
}
return result;
}
};对于Single Number II,网上还有一种与、异或等位操作的解法,尚未完全理解,先记录下
int singleNumber(int A[], int n)
{
int one = 0, two = 0;
for (int i = 0; i < n; i++)
{
two |= A[i] & one;
one ^= A[i];
int three = one & two;
one &= ~three;
two &= ~three;
}
return one;
}LeetCode 136、137:Single Number I & II
标签:leetcode 位运算 single number single numberii
原文地址:http://blog.csdn.net/sunao2002002/article/details/45674029