落单的数 II
题目
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。
样例
给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4
挑战
一次遍历,常数级的额外空间复杂度
题解
1.HashMap
一次遍历,但需要O(n)空间复杂度
public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int i=0;i<A.length;i++)
{
if (!map.containsKey(A[i]))
{
map.put(A[i],1);
}
else
{
if (map.remove(A[i]) == 1)
{
map.put(A[i],2);
}
}
}
return (Integer)map.keySet().toArray()[0];
}
}
2.Bit数组
利用bit位来存储状态,以达到节约空间的目的,用一个32位的数的每一位表示数组中的某个元素出现几次,出现3次就清零。
public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
int result=0;
int[] bits=new int[32];
for (int i = 0; i < 32; i++)
{
for(int j = 0; j < A.length; j++)
{
bits[i] += A[j] >> i & 1;
bits[i] %= 3;
}
result |= (bits[i] << i);
}
return result;
}
}
Last Update 2016.10.5