My code:
public class Solution {
public int singleNumber(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int[] arr = new int[32];
int ret = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < 32; j++) {
if (((nums[i] >> j) & 1) == 1)
arr[j] += 1;
}
}
for (int i = 0; i < 32; i++) {
if (arr[i] % 3 == 1)
ret += (1 << i);
}
return ret;
}
}
My test result:
这道题目,看了之后就决定看答案了,bit manipulation,记住怎么操作就行了。
然后 这类题目,目前还不想深入介入。
看这个博文就懂了。
http://www.cnblogs.com/springfor/p/3870863.html
**
总结: bit maniupulation
明天微软面试, 内心其实很看重,很在乎,所以很紧张。希望好运!
希望女朋友的托福成绩可以有进步!
**
Anyway, Good luck, Richardo!
My code:
public class Solution {
public int singleNumber(int[] nums) {
if (nums == null || nums.length == 0)
return -1;
int[] count = new int[32];
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < 32; j++) {
if (((nums[i] >> j) & 1) == 1) {
count[j] += 1;
count[j] = count[j] % 3;
}
}
}
int base = 1;
int ret = 0;
for (int i = 0; i < 32; i++) {
ret += count[i] * base;
base *= 2;
}
return ret;
}
}
没怎么细想,看答案做了出来。
其实就是把每个数都拆车2为底的多块。用一个32位数组记录个数。然后 % 3,因为出现三次的数,他们各个部分的次数一定是3,可以全部消除。
由此可以想到,如果这个数列中,所有数字都出现了k次,只有一个数字只用了一次。
那么就是同样的方法, % k
累,晚安。
Anyway, Good luck, Richardo!
My code:
public class Solution {
public int singleNumber(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
int[] bits = new int[32];
for (int i = 0; i < nums.length; i++) {
int temp = nums[i];
for (int j = 31; j >= 0; j--) {
if ((temp & 1) == 1) {
bits[j]++;
}
temp = (temp >> 1);
}
}
int ret = 0;
int base = 1;
for (int i = 31; i >= 0; i--) {
ret += (bits[i] % 3) * base;
base *= 2;
}
return ret;
}
}
没想到直接做了出来。还是记得思路吧。。。
Anyway, Good luck, Richardo! 08/05/2016