Leetcode476. 数字的补数

leetcode:476.数字的补数 题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-complement 对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。 例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。 给你一个整数 num ,输出它的补数。 示例 1: 输入:num = 5 输出:2 解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你 阅读详情

Every day a leetcode

题目来源:476. 数字的补数

解法1:模拟

先将数字n转化为二进制,再将每一位取反,再转换为十进制整数。

代码:

/*
 * @lc app=leetcode.cn id=476 lang=cpp
 *
 * [476] 数字的补数
 */

// @lc code=start
class Solution
{
    vector<int> trans(int n)
    {
        vector<int> result;
        while (n > 0)
        {
            result.push_back(n % 2);
            n /= 2;
        }
        reverse(result.begin(), result.end());
        return result;
    }
    void reverseBits(vector<int>& bits)
    {
                for (int i = 0; i < bits.size(); i++)
        {
            if (bits[i] == 1)
                bits[i] = 0;
            else
                bits[i] = 1;
        }
    }

    int toNum(vector<int> v)
    {
        int n = v.size();
        int sum = 0;
        for (int i = 0; i < n; i++)
            sum += v[i] * pow(2, n - i - 1);
        return sum;
    }

public:
    int findComplement(int num)
    {
        vector<int> bits = trans(num);
        reverseBits(bits);
        return toNum(bits);
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(log num),将num转化为二进制的时间复杂度为O(log num),遍历二进制数组的时间复杂度为O(log num),故总的时间复杂度为O(log num)。

空间复杂度:O(1)。二进制数组的长度为常数个。

解法2:位运算

根据题目的要求,我们需要将 num 二进制表示的每一位取反。然而在计算机存储整数时,并不会仅仅存储有效的二进制位。例如当 num=5 时,它的二进制表示为:(101) 2,而使用 32 位整数存储时的结果为:(0000 0000 0000 0000 0000 0000 0000 0101)2。

因此我们需要首先找到 num 二进制表示最高位的那个 1,再将这个 1 以及更低的位进行取反。

在这之后,我们就可以遍历 num 的第 0∼i 个二进制位,将它们依次进行取反。我们也可以用更高效的方式,构造掩码mask=2i+1 −1,它是一个 i+1 位的二进制数,并且每一位都是 1。我们将 num 与 mask 进行异或运算,即可得到答案。

注意:当i=30时,构造掩码mask=2i+1 −1的过程中需要保证不会产生整数溢出。下面部分语言的代码中对该情况进行了特殊判断。

代码:

class Solution {
public:
    int findComplement(int num) {
        int highbit = 0;
        for (int i = 1; i <= 30; ++i) {
            if (num >= (1 << i)) {
                highbit = i;
            }
            else {
                break;
            }            
        }
        int mask = (highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1);
        return num ^ mask;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(log num),找出 num 二进制表示最高位的 1 需要的时间为 O(log num)。

空间复杂度:O(1)。

振镜控制卡硬件接口揭秘:XY2-100/SL2-100协议对比 本文对比分析了工业振镜控制领域两种主流数字通信协议XY2-100和SL2-100的硬件接口差异与应用场景。XY2-100作为开放式协议兼容性强,采用LVDS差分信号传输,适用于激光打标等中高精度场景;SL2-100为半封闭协议,采用RS485差分信号,专为高速响应场景设计。文章详细解析了两种协议的引脚定义、通信机制和性能参数,指出XY2-100适配多品牌振镜且调试简单,SL2-100则更适合Nutfield专用设备的高速高精度需求。最后提供了接口调试的实操建议和选型逻辑,强调应根据具体应用场景的精度、速度和 阅读详情

相关推荐

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 489

[Golang]力扣Leetcode - 476. 数字的补数

[Golang]力扣Leetcode - 476. 数字的补数

皮埃尔的博客 276

【CVPR 2025】低光增强HVI论文精读与源码复现---part1 论文网络精读

【CVPR 2025】本文参考论文HVI: A New Color Space for Low-light Image Enhancement part1 在文章中对论文核心网络与原理展开详细解释 part2 对论文公开代码的arch网络与其他核心部分展开详细解释

BOB_BOB_BOB_的博客 3271

leetcode 476. 数字的补数

leetcode 476. 数字的补数 题目描述 给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 注意: 给定的整数保证在32位带符号整数的范围内。 你可以假定二进制数不包含前导零位。 示例 1: 输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。 示例 2: 输入: 1 输出: 0 解释: 1的二进制表示为1(没有前导零...

EngineerHe的博客 665

CTP-API开发系列之三:柜台系统简介

综合交易平台(Comprehensive Transaction Platform,CTP)是专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制和结算三大系统组成。接下来分享的内容,对于期货公司的负责交易、运维同事会比较熟悉,针对CTP-API接口对接的朋友可以了解一下,在接口之上的系统是怎样的。

码上助君的专栏 6205

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9617

Leetcode 476. 数字的补数 C++

Leetcode 476. 数字的补数 题目 给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 测试样例 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。 示例 2: 输入: 1 输出: 0 解释: 1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。 注意: 给定的整数保证在 32 位带符号整数的范围内。 你可以假定二进制数不包含前导零位。 本题与 1009 https://leetc

weixin_43750513的博客 257

CRC_16---ModBus 计算方法及代码实现

1、 CRC寄存器初始值为 0xFFFF;即16个字节全为1; 2、 CRC-16 / ModBus的多项式0xA001H (1010 0000 0000 0001B) ; ‘H’表示16进制数,‘B’表示二进制数。 计算步骤为: (1).预置 16 位寄存器为十六进制 0xFFFF(即全为 1) ,称此寄存器为 CRC 寄存器; (2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄存器; (3).检测相异或后的CRC寄存器的最低位,若最低位为1,CRC寄存器

1万+

力扣Java编译器_力扣(LeetCode)476. 数字的补数

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。注意:给定的整数保证在32位带符号整数的范围内。你可以假定二进制数不包含前导零位。示例 1:输入: 5输出: 2解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。示例 2:输入: 1输出: 0解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。Java版class Solution {...

weixin_30328003的博客 652

流体仿真软件:COMSOL Multiphysics二次开发_(3).流体仿真基础理论

流体仿真基础理论包括流体的基本性质、流体运动方程、边界条件、初始条件、湍流模型和网格生成等。在使用COMSOL Multiphysics进行流体仿真时,正确设置这些参数和条件是获得准确仿真结果的关键。通过实际应用案例,可以更好地理解如何在COMSOL中进行流体仿真,并提取和分析仿真结果。希望本文对流体仿真初学者和从业人员有所帮助。

kkchenjj的博客 1343

21天学会基于 Linux 的 NPU 固件开发--12.3 如何参与 Linux 内核 NPU 子系统开发

从修复一个简单的文档拼写错误开始,或者为现有的开源 NPU 驱动(如 Sophgo, StarFive, Etinix 等厂商已上游化的驱动)添加一个缺失的 IOCTL 支持或优化一个算子,都是伟大的第一步。在 2026 年的 Linux Kernel (v6.12+) 中,NPU 驱动不再是孤立的字符设备,而是深度集成在 DRM 和 DMA-BUF 生态中,实现了与 GPU 类似的资源管理和调度能力。内核驱动必须提供清晰的 UAPI (User API),通常定义在。Step 4: 合并 (Merge)

amy_mhd的博客 68

LeetCode 476 数字的补数

LeetCode 476 数字的补数 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-complement/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。 例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。 给你一个整数 num ,输

Rp的博客 173

Host是如何与EC通信的

EC中有三个寄存器,分别为状态寄存器EC_SC、命令寄存器EC_SC和数据寄存器EC_DATA。而状态寄存器和命令寄存器同属于一个寄存器,这几个寄存器遵循着ACPI EC规范。host可以根据ACPI协议规范来与EC进行通信。 以下是个寄存器的详细介绍。 EC状态寄存器(EC_SC(R)),该寄存器是一个只读寄存器,它反映了此时EC接口的状态。下图为该寄存器表。 EC状态寄存器表中各位的具体含义: OBF(Output Buffer is Full),该状态位置1...

qq_30135687的博客 3699

力扣(LeetCode)476. 数字的补数

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 注意: 给定的整数保证在32位带符号整数的范围内。 你可以假定二进制数不包含前导零位。 示例 1: 输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。 示例 2: 输入: 1 输出: 0 解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。 Java版 cla...

weixin_30819085的博客 105

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

力扣-第476题《数字的补数》

对整数的二进制表示取反(0变11变0)后,再转换为十进制表示,可以得到这个整数的补数。5"101""010"2给你一个整数num,输出它的补数。

ljb_53421的博客 367

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

leetcode 476. Number Complement 数字的补数

摘要: 题目要求计算一个整数的补数(即二进制表示中各位取反)。解法通过两次遍历实现:第一次确定最高有效位的位置,第二次逐位取反并累加。时间复杂度O(1)(固定32位循环),空间复杂度O(1)。代码使用位操作和移位,高效地实现了补数计算。 关键词:数字补数、位操作、二进制取反、时间复杂度O(1)、移位运算

邹九的个人博客 413

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

leetcode 算法题476 (简单121) 数字的补数

leetcode 算法题476 (简单121) 数字的补数 题目介绍 给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 注意 给定的整数保证在32位带符号整数的范围内。 你可以假定二进制数不包含前导零位。 示例 输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。 输入: 1 输出: 0 解释: 1的二进制表...

FYuu95100的博客 276

leetcode476. 数字的补数

我们知道,取反最快的方法是异或,直接对-1(11...11全是1)就可以得到取反数,所以我们可以使用用户的 方法来解决这个题。但是需要注意的是,我们需要忽略前置0,就是说前面的所有0都要忽略,从首位为1开始异或,所以我们不能直接异或-1,例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2。对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。解释:1 的二进制表示为 1(没有前导零位),其补数为 0。

dengjiayue的博客 380

leetcode:476. 数字的补数(python3解法,数学相关算法题)

leetcode:476. 数字的补数(python3解法,数学相关算法题)

qq_41905051的博客 228

leetcode刷题之476.数字的补数

leetcode刷题之476.数字的补数 题目: 给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 注意: 给定的整数保证在32位带符号整数的范围内。 你可以假定二进制数不包含前导零位。 示例: 示例1 输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。 示例 2: 输入: 1 输出: 0 解释: 1的二进制表示为1...

胡萝卜 218

#力扣 LeetCode476. 数字的补数 @FDDLC

题目描述: https://leetcode-cn.com/problems/number-complement/ Java代码: class Solution { //给定一个正整数 public int findComplement(int num) { int t=num,sum=1; while(t!=1){ sum*=2; t=t/2; } return sum-1.

LiuXingchang的博客 339

Java实现 LeetCode 476 数字的补数

476. 数字的补数 给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。 示例 2: 输入: 1 输出: 0 解释: 1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。 注意: 给定的整数保证在 32 位带符号整数的范围内。 你可以假...

南 墙 1万+

LeetCode 476. 数字的补数(位运算)

【代码】LeetCode 476. 数字的补数(位运算)

记录一些刷过的题并分享学习心得 229

Leetcode 476. 数字的补数 位运算

原题链接:Leetcode 476. 数字的补数 class Solution { public: int findComplement(int num) { int res=0,i=0; while(num) { if(num&1) res&=~(1<<i); else res|=(1<<i); num>>=1; i++;

想买很多漂亮衣服但是买不起的博客 119

Leetcode 476 数字的补数

Leetcode 476 数字的补数 题目   给你一个 正 整数 num ,输出它的补数。补数是对该数的二进制表示取反。 解题思路   由于没有前导零,就是二进制取反操作,那么只需要知道它有多少位,用全是1的数求异或就行了。 代码 class Solution { public int findComplement(int num) { int ans = num, target = 0; while (num != 0) { num &gt

博学 笃志 切问 近思 113
上一篇: Leetcode463. 岛屿的周长
下一篇: Leetcode482. 密钥格式化
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值