标签:
Single Number I
直接异或解决。
class Solution { public: int singleNumber(int A[], int n) { int res=0; for(int i=0;i<n;i++) { res=res^A[i]; } return res; } };
Single Number II
分析1
由于int型由32bit表示,因此可以用一个长度为32的int数组保存各个比特位上1出现的次数。最后,将数组各元素对3取余,那么32位数组就纪录了只出现了一次的整数的二进制表示。
public class SingleNumberII { private final static int INTEGER_DIGITS = 32; public int singleNumber(int[] A) { if (A == null || A.length <= 0) { return 0; } int ret = 0; int[] count = new int[INTEGER_DIGITS]; for (int i = 0; i < INTEGER_DIGITS; ++i) { for (int j = 0; j < A.length; ++j) { count[i] += (A[j] >> i) & 0x0001; } ret |= (count[i] % 3) << i; } return ret; } }
分析2
我们也没必要开 int bit[32]的数组去统计的
我们来模拟二进制加法
用两位来计数,到3就把该位清零。
bit2 bit1
bit1 如果该位来的是1 ,保持0,1,0,1。。。(也就是xor,异或),如果是0就不变
当bit1=1的时候再来一个1,那么bit2=1
当这两个bit同时为1,说明这是3啦(二进制你想想嘛),该位清零。
class Solution { public: int singleNumber(int A[], int n) { int ones = 0, twos = 0, threes = 0; for(int i = 0; i < n; i++) { threes = twos & A[i]; //已经出现两次并且再次出现 twos = twos | ones & A[i]; //曾经出现两次的或者曾经出现一次但是再次出现的 ones = ones | A[i]; //出现一次的 twos = twos & ~threes; //当某一位出现三次后,我们就从出现两次中消除该位 ones = ones & ~threes; //当某一位出现三次后,我们就从出现一次中消除该位 } return ones; //twos, threes最终都为0.ones是只出现一次的数 } };
标签:
原文地址:http://www.cnblogs.com/qiaozhoulin/p/4581654.html