数组中唯一一个只出现一次的数字

题目

数组中除一个数字只出现一次外,其他数字都出现了三次,请找出这个唯一只出现一次的数字。

思路

思路一

使用排序的方法,排序后遍历排序后的数组。时间复杂度为O(nlgn).

思路二

使用哈希表,时间复杂为O(n),但是需要空间复杂度也为O(n)

思路三

由于每个数字都出现了三次,而同一个数字每一位上的值都相同,可以分别把所有数字的每一位上的数字加起来(不含进位),每一位的和余3后的值就是该数字的二进制表示。

代码

public static int findNumberAppearingOnce(int[] datas){
    int length = datas.length;
    int[] number = new int[32];
    for(int i = 0;i < number.length;i++)number[i] = 0;
    for(int i = 0;i < length;i++){
        int bitMask = 1;
        for(int j = 31;j >= 0;j--){
            int bit = datas[i] & bitMask;
            if(bit != 0)number[j] += bit;
            bitMask = bitMask << 1;
        }
    }
    int result = 0;
    for(int i = 0;i < 32;i++){
        result  = result << 1;
        result += (number[i] % 3);
    }
    return result;
}

 

总结

数组总只出现几次的数字这类题,除了使用排序的方法,还可以使用哈希表和位运算。

位运算的效率更高,所以应该熟悉位运算的规律。

发布了66 篇原创文章 · 获赞 3 · 访问量 4812

猜你喜欢

转载自blog.csdn.net/weixin_42518668/article/details/104351047