侧边栏壁纸
博主头像
Fonda's Lab 博主等级

关山难越,谁悲失路之人?萍水相逢,尽是他乡之客。

  • 累计撰写 49 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

动态规划-计算数字到零所需要的步骤(leetcode1342)

LouisFonda
2024-04-26 / 0 评论 / 0 点赞 / 5 阅读 / 0 字 / 正在检测是否收录...

动态规划-将数字变成零所需要操作的次数1342

动态规划-将数字变成 0 的操作次数-1342.png

分析:

  1. 普通思路解决,在外部定义个变量用于保存操作过的次数,用一个while循环不停的处理这个数据,只要这个数值不是零就处理,当这个数值为偶数时我们就将除2,如果是奇数就将它减1,知道循环结束返回保存的次数

  2. 这其实也可以用动态规划来做,但是动态规划的做法不管是时间复杂度还是空间复杂度都高得离谱,所以不推荐,只作为一种思路来学习

提示:在判断一个数是不是偶数时我们可以通过求余数,比如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]

}

这段代码执行效率非常低,只作为思路递推的理解。

0

评论区