给你一个以二进制形式表示的数字 s 。请你返回按下述规则将其减少到 1 所需要的步骤数:
如果当前数字为偶数,则将其除以 2 。
如果当前数字为奇数,则将其加上 1 。
题目保证你总是可以按上述规则将测试用例变为 1 。
示例 1:
输入:s = "1101"
输出:6
解释:"1101" 表示十进制数 13 。
Step 1) 13 是奇数,加 1 得到 14
Step 2) 14 是偶数,除 2 得到 7
Step 3) 7 是奇数,加 1 得到 8
Step 4) 8 是偶数,除 2 得到 4
Step 5) 4 是偶数,除 2 得到 2
Step 6) 2 是偶数,除 2 得到 1
示例 2:
输入:s = "10"
输出:1
解释:"10" 表示十进制数 2 。
Step 1) 2 是偶数,除 2 得到 1
示例 3:
输入:s = "1"
输出:0
提示:
1 <= s.length <= 500
s 由字符 ‘0‘ 或 ‘1‘ 组成。
s[0] == ‘1‘
/**
* @param {string} s
* @return {number}
*/
var numSteps = function(s) {
let arr = s.split(‘‘);
let res = 0;
while (arr.length > 1) {
// console.log(arr);
if (arr[arr.length - 1] === ‘1‘) {//奇数,+1
plusOne(arr);
} else if (arr[arr.length - 1] === ‘0‘) {//偶数 右移一位 >>1
arr.pop(); //右移1位, 相当于 s>>1
}
res++;
}
return res;
};
//+1
function plusOne(arr) {
let flag = false;
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] === ‘1‘) {
arr[i] = ‘0‘;
} else {
arr[i] = ‘1‘;
flag = true;
break;
}
}
if (!flag) {//全是1,再进1位
arr.unshift(‘1‘);
}
}
// python3 就不会出现变量溢出的情况
class Solution:
def numSteps(self, s: str) -> int:
s = int(s, 2)
ret = 0
while s!=1:
ret += 1
if s%2:
s+=1
else:
s//=2
return ret
/**
* @param {string} s
* @return {number}
*/
var numSteps = function(s) {
// python3是可以的,可能p3里面不存在超出变量表达范围
// s = parseInt(s,2)
// let ret = 0
// while(s!=1) {
// ret += 1
// if(s%2){
// s+=1;
// } else {
// s/=2
// }
// }
// return ret
let cs = s.split(‘‘);
let n = cs.length;
let i = n-1;
let count = 0;
let top = 0;
while(i>0){
if(cs[i]==‘1‘){
let j = i-1;
while(j>=0&&cs[j]==‘1‘){
--j;
}
if(j>=0) cs[j] = ‘1‘;
else top = 1;
count += i-j+1;
i = j;
}else{
--i;
++count;
}
}
return count;
// >> 计算机把s当成了10进制,就是原来题给的二进制, p3可以可能表示变量的机制不一样
// let step = 0;
// while(true){
// if(s===1) return step
// if(s[s.length-1]==0){
// s >>=1; // 我也想又移一位,但就不会说二进制数组pop一下
// step++
// }else{
// num+=1; // +1 也可以二进制数组从后向前遍历啊,这么简单个场景
// step++
// }
// }
// 后面测试用例通不过,估计是变量超范围
// let num = parseInt(s,2)
// let step = 0;
// while(true){
// if(num===1) return step
// if(num%2===0){
// num/=2;
// step++
// }else{
// num+=1;
// step++
// }
// }
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原文:https://www.cnblogs.com/zhangzs000/p/12640593.html