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

这篇博客探讨了如何在数组中找到唯一出现一次的数字。首先介绍了使用HashMap统计每个数字出现次数的方法,实现了O(n)的时间复杂度和O(n)的空间复杂度。然后提出了一种优化方案,仅使用O(n)时间和额外O(1)空间,通过统计每一位1的个数来确定目标数字,避免了额外存储需求。这种方法巧妙地利用了位运算,提高了效率。
摘要由CSDN通过智能技术生成

【题目描述】

在这里插入图片描述
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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值