标签:
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?
思路:
考虑全部用二进制表示,如果我们把 第 i th 个位置上所有数字的和对3取余,那么只会有两个结果 0 或 1 (根据题意,3个0或3个1相加余数都为0). 因此取余的结果就是那个 “Single Number”.
一个直接的实现就是用大小为 32的数组来记录所有 位上的和。
int singleNumber(int A[], int n) { int count[32] = {0}; int result = 0; for (int i = 0; i < 32; i++) { for (int j = 0; j < n; j++) { if ((A[j] >> i) & 1) { count[i]++; } } result |= ((count[i] % 3) << i); } return result; }
改进:
这个算法是有改进的空间的,可以使用掩码变量:
ones
代表第i th 位只出现一次的掩码变量twos
代表第i th 位只出现两次次的掩码变量假设在数组的开头连续出现3次5,则变化如下:
ones = 101 twos = 0 -------------- ones = 0 twos = 101 -------------- ones = 0 twos = 0 --------------
当第 i th 位出现3次时,我们就ones
和twos
的第 i th 位设置为0. 最终的答案就是 ones。
代码如下:
public int singleNumber(int[] A) { int one = 0; int two = 0; int tmp; for(int i=0; i<A.length; i++) { two = (A[i] & one) | two; one = one ^ A[i]; tmp = ~(one & two); one = one & tmp; two = two & tmp; } return one; }
以上分析部分参考自推酷:http://www.tuicool.com/articles/fAZZv2a
标签:
原文地址:http://www.cnblogs.com/linxiong/p/4322581.html