剑指Offer面试题56-2:数组中唯一只出现一次的数字(位运算,有限状态自动机)

这道题是上一道题的变形,也是位运算,但是不论是同或或者异或,都不能解决问题,想不出来办法,看了答案。

答案上的思路,既然是其他数字都出现了三次,那么将所有数字的每一位对应的值相加,能被三整除的就说明,那个只出现一次的数字在这一位上的值是0,否则是1.

但是leetcode上给出了更简洁的答案,有限状态自动机(https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/

我的代码,代码不难写

    public int singleNumber(int[] nums) {
        int[] bit_value = new int[32];
        for(int count  = 0;count<32;count++){
            bit_value[count] = 0;
        } 

        for(int count = 0;count<nums.length;count++){
            int residual = nums[count];
            for(int count_bit = 0;count_bit<32;count_bit++){
                int value = residual%2;
                residual = residual/2;
                bit_value[count_bit] += value;
                if(residual == 0){
                    break;
                }
            }
        }
        int res = 0;
        int value = 1;
        for(int count_bit = 0;count_bit<32;count_bit++){
            if(bit_value[count_bit]%3 != 0){
                res += value;
            }
            value *= 2;
        }
        return res;
    }

答案代码

    public int singleNumber(int[] nums) {
        int ones = 0, twos = 0;
        for(int num : nums){
            ones = ones ^ num & ~twos;
            twos = twos ^ num & ~ones;
        }
        return ones;
    }

作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/115025483
今日推荐