本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
二、思路分析
对2取余,区分奇偶数,返回得到0操作的次数. 有二进制转换内味儿。
三、AC代码
5中解法依次是:
1.遍历 对2取余 返回次数
var numberOfSteps = function(num) {
for(let i=0; ; i++) {
if(num == 0){
return i;
}else{
if( num % 2 == 0){
num = num / 2;
}else{
num = num - 1;
}
}
}
}
2.递归 三目运算符 (我猜num >> 1可以当做除以2)
var numberOfSteps = function(num) {
return num > 1 ? 1 + (num % 2) + numberOfSteps( num>>1 ) : num;
};
3.while (我猜num >> 1可以当做除以2)
var numberOfSteps = function(num) {
let i = 0;
while(num) {
if(num % 2) num--;
else num = num >> 1;
i++;
}
return i;
};
4.replace() toString() 二进制
偶数的次数就是二进制的位数,奇数的次数就是除最高位以外的1的个数。
var str = num.toString(2);
return str.length + str.replace(/0/g,"").length - 1;
例如:8 二进制即 1000,共4位,所以总步数为4
例如:23 二进制即 10111,共5位,除最高位后面有3个1,所以总步数为8
4.递归
var numberOfSteps = function(num) {
if(num==0){
return 0
}else if(num%2==0){
return numberOfSteps(num/2)+1
}else if(num%2==1){
return numberOfSteps((num-1))+1
}
};
4.二进制转换
看到这道题,就感觉有点像笔算10进制转2进制的过程,所以感觉可以利用这个过程来求解。 比如14转二进制是1110,其中有3个1,每个1代表一次除以2余1的操作,那么在题目中这属于两步(因为要多算一步减1),而0代表除以2余0,在题目中只有一步。
所以1,1,1,0 在题目眼中是这样的:2,2,2,1,直接累加起来,当然最后要减去最后一步已经是0的操作。 表达的可能不是很清楚,直接看代码,简单易懂。
var numberOfSteps = function(num) {
return num.toString(2).split('').reduce((total, el) => Number(total) + Number(el) + 1, 0) - 1
};
四、总结
啊 我人没了