剑指Offer打卡day42——ACWing 74. 数组中唯一只出现一次的数字

Posted Johnny*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer打卡day42——ACWing 74. 数组中唯一只出现一次的数字相关的知识,希望对你有一定的参考价值。

【题目描述】

在这里插入图片描述
ACWing 74. 数组中唯一只出现一次的数字

【思路】

使用Map来统计每个数字出现的次数

时间复杂度O(n)
空间复杂度O(n)

class Solution {
    public int findNumberAppearingOnce(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int x: nums){
            if( map.containsKey(x) ) map.put( x, map.get(x) + 1);
            else map.put(x, 1);
        }
        for(int x: nums)
            if( map.get(x) == 1 )
                return x;
        return 0;
    }
}

如果要求只使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?

【思路】
统计每一位1的个数 若不能被3整除 则说明要求的数字该位为1

class Solution {
    public int findNumberAppearingOnce(int[] nums) {
        
        int ans = 0;
        for(int i = 31; i >= 0; i --){
            int cnt = 0;
            for(int x: nums){
                if( ( x >> i & 1 )== 1){
                    cnt ++;
                }
            }
            if( cnt % 3 == 1) ans = ans *2 +1; //该位为1
            else ans *= 2;
        }
        
        return ans;
    }
}

以上是关于剑指Offer打卡day42——ACWing 74. 数组中唯一只出现一次的数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡day42——AcWing 77. 翻转单词顺序

剑指Offer打卡day42—— ACWing 81. 扑克牌的顺子

剑指Offer打卡day42—— AcWing 65. 数组中的逆序对

剑指Offer打卡day39 —— Acwing 42. 栈的压入弹出序列

剑指Offer打卡目录(Java实现)

剑指Offer打卡day43—— Acwing 86. 构建乘积数组