Leetcode - Single Number II

Leetcode - Single Number II_第1张图片

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:

Leetcode - Single Number II_第2张图片

这道题目,看了之后就决定看答案了,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

你可能感兴趣的:(Leetcode - Single Number II)