LeetCode——single-number&single-number-ii

Q:现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现两次。你需要找出只出现一次的元素
注意:你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?
A:
这个题目可以参考 https://www.cnblogs.com/xym4869/p/12331907.html
1.如果可以使用额外的内存空间,可以使用set,set不能添加同一个key两次,如果重复了,set.add返回false
2.所有值异或,相同值异或为0,最后剩下的就是唯一的不同元素。

public static int singleNumber(int[] A) {
    int num = 0;
    for(int i=0;i<A.length;i++){
        num^=A[i];
    }
    return num;
}

Q:现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现三次。你需要找出只出现一次的元素
注意:
你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?
A:
若一个数出现三次,则其对应的二进制数每一位相加必为3或0。
统计数组中所有元素的每一位,若为3的倍数,所求数的该二进制位对3取余为0,否则为1。
举例:{1,1,1,2,2,2,3}
01
01
01
10
10
10
11
--
04%3 = 01
40%3 = 10
--
11

    public int singleNumber(int[] A) {
        int result = 0;
        for (int i = 0; i < 32; ++i) {
            int bits = 0;
            for (int value : A) {
                bits += (value >> i) & 1;//依次获取A中每个元素的第i位,全部和1与后相加
            }
            //这里的|=和+=是一样的,因为当前只会得到在i为为0或1,右侧位全为0的值和i位为0但右侧不一定完全为0的值的和,用或和加都行,但用或会更快
            result |= (bits % 3) << i;
        }
        return result;
    }

这个题还有种解法,可看 https://www.jianshu.com/p/c8612aef41af
但实在太难了,没看懂。

猜你喜欢

转载自www.cnblogs.com/xym4869/p/12458039.html