題目描述:
給你一個以二進制形式表示的數字 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’
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
關鍵是字符串,你不可以轉成Integer,肯定會爆棧
所以使用的是字符串的加法
class Solution {
// 將二進制表示減到 1 的步驟數
public int numSteps(String s) {
if (s.length() == 1)
return 0;
char c = s.charAt(s.length() - 1);
if (c == '1') {
return 1 + numSteps(helper(s));
}
return 1 + numSteps(s.substring(0, s.length() - 1));
}
private String helper(String num) {
StringBuilder builder = new StringBuilder(num);
int n = builder.length();
int index = n - 1;
int carry = 1;
while (index >= 0 && carry != 0) {
int t = builder.charAt(index) - '0';
builder.setCharAt(index, (char) ((t + carry) % 2 + '0'));
carry = (t + carry) >>> 1;
index--;
}
if (carry == 1) builder.insert(0, "1");
return builder.toString();
}
}