首页 > 编程语言 >【C++算法】36.位运算_只出现一次的数字 II

【C++算法】36.位运算_只出现一次的数字 II

时间:2024-12-09 21:00:03浏览次数:8  
标签:nums int sum 36 C++ II 二进制 ret 位是

文章目录


题目链接:

137. 只出现一次的数字 II


题目描述:

763d0984616f7359308e3e455c57601e


解法

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。说明时间复杂度O(n),空间复杂度O(1)

b6ed322a69c333c40ba88bdb4833a4e2

意外发现出现1次的那个数和所有比特位当前的和%3得到的值一样。

我们就可以求所有比特位当前的和%3得到的值,每一位结合起来就是只出现1次的那个数。


C++ 算法代码:

class Solution 
{
    public:
    int singleNumber(vector<int>& nums) 
    {
        int ret = 0;
        for(int i = 0; i < 32; i++) // 依次去修改 ret 中的每一位
        {
            int sum = 0;
            for(int x : nums) // 计算nums中所有的数的第 i 位的和
            {
                if(((x >> i) & 1) == 1){ // 检查数字 x 的第 i 位是否为1
                    sum++; // 如果是1,累加到 sum 中
                }
            }
            sum %= 3;
            if(sum == 1) // 如果 sum % 3 == 1,说明只出现一次的数字在第 i 位是1
            {
                ret |= 1 << i; // 将 ret 的第 i 位设置为1
            }
        }
        return ret;
    }
};

解析

例如:nums = [2,2,3,2]

  1. ret = 0

    遍历每一位
    i = 0(最低位)
    计算 sum
    2 的第 0 位是 0
    2 的第 0 位是 0
    3 的第 0 位是 1
    2 的第 0 位是 0
    sum = 0 + 0 + 1 + 0 = 1
    取模:sum % 3 = 1
    更新 ret
    因为 sum % 3 == 1,所以将 ret 的第 0 位设置为 1
    ret = 0 | (1 << 0) = 1(二进制 0001

  2. i = 1(第二位)
    计算 sum
    2 的第 1 位是 1
    2 的第 1 位是 1
    3 的第 1 位是 1
    2 的第 1 位是 1
    sum = 1 + 1 + 1 + 1 = 4
    取模:sum % 3 = 1
    更新 ret
    因为 sum % 3 == 1,所以将 ret 的第 1 位设置为 1
    ret = 1 | (1 << 1) = 3(二进制 0011

  3. i = 331(高位)
    对于这些位,nums 中所有数字的对应位都是 0,所以 sum = 0,sum % 3 = 0ret 的这些位保持 0

  4. ret = 3(二进制 0011
    这些位,nums 中所有数字的对应位都是 0,所以 sum = 0,sum % 3 = 0ret 的这些位保持 0

  5. ret = 3(二进制 0011

标签:nums,int,sum,36,C++,II,二进制,ret,位是
From: https://blog.csdn.net/hlyd520/article/details/144357769

相关文章

  • c++ 模板编程
    c++模板编程C++中模板分为函数模板和类模板函数模板:是一种抽象函数定义,它代表一类同构函数。类模板:是一种更高层次的抽象的类定义。优缺点优点代码复用  模板允许编写与具体数据类型无关的代码,从而实现代码复用。你可以针对不同的数据类型使用相同的模板函数或模板类,而......
  • XCVM1302-3HSEVFVB1369通过业界领先的 DDR 内存接口实现高数据吞吐量 - AMD Versal Pr
    XCVM1302-2MLIVSVF1369XCVM1302-2MSEVSVF1369XCVM1302-2MSIVFVB1369XCVM1302-2MSIVSVF1369XCVM1302-3HSEVFVB1369明佳达Versal自适应SoC兼具可编程逻辑和加速引擎的灵活处理能力,以及先进的内存和接口技术,可为各类应用实现定制化、强大的异构加速。VersalPrime系列是基......
  • C++小小复习一下
    类,对象,成员变量,成员函数特点:面向对象程序设计---因为要创建对象来调用类里面的函数或者成员变量比如你的对象是一个生物-人:他会有自己的一些属性:身高,体重,性别等,还有一些行为比如:有人惹他,他会骂回去或者打回去,这个骂和打的动作或者行为需要一系列的身体各个机能共同合作才能实......
  • 886. 求组合数 II
    //886.求组合数II.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*https://www.acwing.com/problem/content/888/给定n组询问,每组询问给定两个整数a,b,请你输出Cbamod(109+7)的值。输入格式第一行包含整数n。接下来n行,每行包含一组a和b。......
  • C++_默认构造函数和重载以及设计模式
    类和类之间关系类外:静态变量,是在编译阶段就分配好空间,对象还没创建的时候就有了空间类:类-对象-对象是类的一个实例类头(classhead)和类体(classbody)。将数据和行为封装在单个单元中--封装成员变量成员函数成员变量称为属性(property);成员函数称为方法(metho......
  • [c++]c++ 工程代码中的debug时条件编译隐去的代码会影响程序运行的性能和耗时吗
    前言 理解在C++(或任何编程语言)中,使用条件编译(如通过#ifdef,#ifndef,#endif预处理指令)来根据调试(debug)或发布(release)模式包含或排除代码段,对程序在最终编译后的性能和耗时通常是没有直接影响的。这是因为条件编译指令是在编译之前处理的,它们决定了哪些代码会被编译器实际编......
  • Qt/C++离线读取全国任意经纬度高程海拔值/无任何依赖/纯原创代码解析
    一、前言说明做地图开发会遇到一个常规需求,就是获取当前经纬度对应的海拔高度,也叫做高程值,很遗憾各大地图厂商都未提供接口获取,可能是有明文规定,不能地图中提供对应的海拔高度值,于是需要另想他法,尽管谷歌地图在线的api接口是提供了海拔高度值,但是懂得都懂,国内哪里还能用谷歌地图?......
  • 2024年厦门市第31届小学生C++信息学竞赛试题与解析(第二部分填空题6-10)
    最长上升子序列参考程序:#include<iostream>#include<vector>#include<algorithm>//为了使用std::maxintlengthOfLIS(conststd::vector<int>&nums){if(nums.empty()){return0;}intn=nums.size();std::vector......
  • 2024年厦门市第31届小学生C++信息学竞赛试题与解析(第二部分填空题1-5)
    ......
  • 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名)
    https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系统是基于.netcore/WPF开发的一款在线客服软件,宗旨是: 开放、开源、共享。努力打造.net社区的一款优秀开源产品。背景我在业余时间开发的这个客服系统,有一个问题始终让我饱受困扰,360以及各种国产......