二、將二進制表示減到 1 的步驟數(Weekly Contest 183)

題目描述:
給你一個以二進制形式表示的數字 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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章