LeetCode 练习——137. 只出现一次的数字 II

博客介绍了如何通过位运算解决LeetCode上的第137题,即在一个整数数组中找出仅出现一次的数字。文章详细阐述了将数组元素转换为二进制并统计每一位出现次数的方法,通过判断各位出现次数除以3的余数来确定答案。代码实现中,遍历数组并将元素转换为二进制,统计32位(对应int类型)中每位的个数,最后找到余数不为0的位,组合成最终答案。测试结果显示代码正确并通过了所有测试用例。
摘要由CSDN通过智能技术生成

1.题目描述

LeetCode 137. 只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

2.思路

2.1 代码

将数组转换为二进制,并求出每一位个数,放入长度为32的count数组中(因为使用int类型,因此共32位)。然后再遍历count数组,某一位统计除以3的余数不为0,则只出现一次的那个数字在该位有值。

class Solution {
    public int singleNumber(int[] nums) {
        int[] count = new int[32];
        for(int num : nums){
            for(int i = 0; i < 32; i++){
                count[i] += (num >> i) & 1;
            }
        }
        int ans = 0;
        for(int i = 0; i < 32; i++){
            if (count[i] % 3 != 0) {
                ans |= (1 << i);
            }
        }
        return ans;
    }
}

2.2 测试结果

通过测试
在这里插入图片描述

3.总结

  • 数组元素转换为二进制进行处理,并统计每一位出现的个数
  • 统计个数时使用nums元素右移的方式可以处理负数情况
  • 计算每一位个数除以3余数,并判断余数是否为0
  • int类型32位长
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值