栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【leetcode】【剑指offer Ⅱ】004. 只出现一次的数字

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【leetcode】【剑指offer Ⅱ】004. 只出现一次的数字

问题描述:
  • 给定一个整数数组 nums,除某个元素仅出现一次外,其余每个元素都恰出现三次,找出并返回那个只出现了一次的元素。
核心思路:
  • 该题仍然是考察位运算,但并非利用异或(如果题目中的要求提及其他元素恰出现两次,则可以利用异或操作来解题)。
    • 把每个整数看成二进制表达形式,当同一个数出现三次,则可以看作将对应位上的 0 或 1 出现三次。
    • 遍历每个数值,将数值对应的 32 位二进制出现的 1 出现的次数进行对应位置上的累加(累加到一个 32 位数组中进行保存)。
    • 遍历完成后从 32 位的数组中取出每一位上的数值,并将每一位进行 mod 3 操作然后提取出对应位上的 0 或 1 即可。
代码实现:
class Solution
{
public:
    int singleNumber(vector& nums)
    {
        vector cnt(32);
        for(int i = 0; i < 32; ++i)
        {
            for(int num : nums)
                cnt[i] += (num >> i) & 1;
        }
        int ans = 0;
        for(int i = 31; i >= 0; --i)
            ans = (ans << 1) + (cnt[i] % 3);
        return ans;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033561.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号