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?
Ref :http://fisherlei.blogspot.com/2013/11/leetcode-single-number-ii-solution.html
[Thoughts]
这个题有类似于single number的解法,即通过位运算,一遍扫描得到结果。还是读书的时候见过,大概是两个变量,相互做异或、补之类的运算,早不记得详情了。
现在的解法是比较普通的。因为题目已经说了,除了一个数字以外,其他的都出现了3次,如果我们把那个特殊的数剔除,并把剩下的数于每一位来加和的话,每一位上1出现的次数必然都是3的倍数。所以,解法就在这里,将每一位数字分解到32个bit上,统计每一个bit上1出现的次数。最后对于每一个bit上1出现的个数对3取模,剩下的就是结果。
public class Solution { public int singleNumber(int[] A) { int[] bit=new int[32]; // 把 A[] 中的数转换为二进制数,每一位相加,防盗一个32位数组中去 for(int i=0;i<A.length;i++){ for(int j=0;j<32;j++){ // &1 相当于 A[i] & 00001 只取到A[i]的最低位 bit[j]+=(A[i]>>j&1); } } int ret=0; // 因为所有元素出现了3次,除了一个出现了一次的元素。 取余3 剩下的数就是那个元素 for(int i=0;i<32;i++){ ret+=(bit[i]%3)<<i; } return ret; } }