Open
Description
JavaScript实现LeetCode第476题:数字的补数
题目描述
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
给定的整数保证在32位带符号整数的范围内。
你可以假定二进制数不包含前导零位。
示例 1:
输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。
示例 2:
输入: 1
输出: 0
解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。
解答思路
有三种思路
- 先将十进制转为二进制, 然后对每一项作处理(如果是0,则转为1, 如果是1, 则转为0), 然后将该二进制转为十进制.
- 对于思路一, 对每一项操作使用异或操作(异或: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0)
- 利用二进制的定义
补充知识: 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;
};
Metadata
Metadata
Assignees
Labels
No labels