动态规划-将数字变成零所需要操作的次数1342
分析:
普通思路解决,在外部定义个变量用于保存操作过的次数,用一个while循环不停的处理这个数据,只要这个数值不是零就处理,当这个数值为偶数时我们就将除2,如果是奇数就将它减1,知道循环结束返回保存的次数
这其实也可以用动态规划来做,但是动态规划的做法不管是时间复杂度还是空间复杂度都高得离谱,所以不推荐,只作为一种思路来学习
提示:在判断一个数是不是偶数时我们可以通过求余数,比如n%2,如果结果为0表示这个数是偶数,反之是奇数;我们也可以通过 “与” 运算把一个数与1做与运算,如果结果是1则是奇数,结果是0则是偶数,这是因为偶数的最低位为0,比如0二进制就是0,2的二进制位10,4的二进制位100,6的二进制位110,做“与“运算时1的高位会补0,比如:6&1 = 110&001,按位与运算显然结果为000也就是0,所以6是偶数
/**
* @param {number} num
* @return {number}
*/
var numberOfSteps = function(num) {
let count = 0;
while(num) {
count ++
if(num & 1){
num -= 1
}else{
num >>=1
}
}
return count
};
当把一个数向右移一位相当于除2向下取整
动态规划写法
var numberOfSteps = function(num) {
if(num < 3) return num
let arr = []
arr[1] = 1
arr[2] = 2
for(let i=3;i<=num;i++) {
if(i % 2 === 0) {
arr[i] = arr[i>>1] + 1
}else{
arr[i] = arr[i-1] + 1
}
}
return arr[num]
}
这段代码执行效率非常低,只作为思路递推的理解。
评论区