🍞环境:牛客的编译环境
🍰语言:JavaScript
☕️难点:如果自己去将整数变成二进制计算,在计算负数的时候,涉及到反码和补码的操作,这里比较复杂。
🍊题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
🌟解题思路:因为JS在数字底层是使用32位表示整数的。JS里有个toString方法,如果toString(2),则会把数字变成2进制的字符串返回。这个方法可以用来转换进制。这里有更好的方法,比如利用JS在数字底层的表示,可以通过位移与1作与运算来判断是否为1,如果为1,则count++。
🍇最优代码:
function NumberOf1(n)
{
// write code here
if (n===0) return 0;
var count = 0;
for (let i=0;i<32;i++){
if (n & 1){ //右移并与1进行&运算
count++;
}
n = n>>>1;
}
return count;
}
🍡有点耗性能的代码:
function NumberOf1(n)
{
if (n===0) return 0;
var count = 0;
for (let i=0;i<32;i++){
if ((n>>>i & 1) ===1){ //右移并与1进行&运算
count++;
}
}
return count;
}
消耗性能的原因是随着i增加,每次都会重复移动前n-1位,底层位移是一位一位移动的,所以这样很消耗性能。
网友评论