为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript实现LeetCode第476题:数字的补数

标签:
JavaScript

题目描述

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

给定的整数保证在32位带符号整数的范围内。
你可以假定二进制数不包含前导零位。
示例 1:

输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。

示例 2:

输入: 1
输出: 0
解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。

解答思路

有三种思路

  1. 先将十进制转为二进制, 然后对每一项作处理(如果是0,则转为1, 如果是1, 则转为0), 然后将该二进制转为十进制.

  2. 对于思路一, 对每一项操作使用异或操作(异或: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0)

  3. 利用二进制的定义


    webp

    二进制运算

补充知识: javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)

javascript中十进制转其他

const x = 5;  
console.log(x);  
console.log(x.toString(8));  
console.log(x.toString(32));  
console.log(x.toString(16));

javascript中其他转为十进制

const x = 5;  
console.log(parseInt(x, 2));  
console.log(parseInt(x, 8));  
console.log(parseInt(x, 16));

解答方案

方法一:

/**
 * @param {number} num
 * @return {number}
 */var findComplement = function(num) {    const a = num.toString(2);    let result = [];    for(let i = 0;i < a.length; i++) {        if(a[i] == 0) {
            result.push(1);
        } else {
            result.push(0);
        }
    }    return parseInt(result.join(''),2);
};

方法二:

/**
 * @param {number} num
 * @return {number}
 */var findComplement = function(num) {    return parseInt(num.toString(2).split('').map((a) => 1 ^ a).join(''), 2)
};

方法三:

/**
 * @param {number} num
 * @return {number}
 */var findComplement = function(num) {    const a = num.toString(2);    let result = 0;    for(let i = 0;i < a.length; i++) {        if(a[i] == 0) {
            result += Math.pow(2, a.length - i - 1)
        } 
    }    return result;
};

         

              



作者:funnycoderstar
链接:https://www.jianshu.com/p/90c10067e1ec


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消