原题网址:https://leetcode.com/problems/single-number-ii/
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?
方法一:使用哈希映射进行计数。
public class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> counts = new HashMap<>();
Set<Integer> single = new HashSet<>();
for(int i=0; i<nums.length; i++) {
Integer count = counts.get(nums[i]);
if (count == null) {
single.add(nums[i]);
counts.put(nums[i], 1);
} else if (count == 1) {
counts.put(nums[i], count + 1);
} else {
single.remove(nums[i]);
counts.remove(nums[i]);
}
}
if (single.size() == 1) return single.iterator().next();
else return -1;
}
}
方法二:对各位的1比特进行计数。
public class Solution {
public int singleNumber(int[] nums) {
int[] counts = new int[32];
for(int num: nums) {
int mask = 1;
for(int i=0; i<32; i++) {
if ((num & mask) != 0) {
counts[i] ++;
}
mask <<=1;
}
}
int number = 0;
int mask = 1;
for(int i=0; i<32; i++) {
if (counts[i] != 0 && (counts[i] % 3) != 0) {
number |= mask;
}
mask <<=1;
}
return number;
}
}
方法三:人工实现3进制加法。
public class Solution {
/*
http://www.acmerblog.com/leetcode-single-number-ii-5394.html
http://blog.youkuaiyun.com/kenden23/article/details/13625297
http://blog.youkuaiyun.com/foreverling/article/details/49718429
http://www.cnblogs.com/daijinqiao/p/3352893.html
*/
public int singleNumber(int[] A) {
int ones = 0, twos = 0;
for(int i = 0; i < A.length; i++){
ones = (ones ^ A[i]) & ~twos;
twos = (twos ^ A[i]) & ~ones;
}
return ones;
}
}
另一种实现:
public class Solution {
/*
http://www.acmerblog.com/leetcode-single-number-ii-5394.html
http://blog.youkuaiyun.com/kenden23/article/details/13625297
http://blog.youkuaiyun.com/foreverling/article/details/49718429
http://www.cnblogs.com/daijinqiao/p/3352893.html
*/
public int singleNumber(int[] A) {
int bit1 = 0, bit0 = 0;
for(int i=0; i<A.length; i++) {
int bit1n = bit0 & A[i];
int bit0n = bit0 ^ A[i];
int bit1nn = bit1 ^ bit1n;
int three = ~(bit1nn & bit0n);
bit1 = bit1nn & three;
bit0 = bit0n & three;
}
return bit0;
}
}