LeetCode 刷题笔记 - 1404. 将二进制表示减到 1 的步骤数

445 阅读2分钟

难度:

中等

描述:

给你一个以二进制形式表示的数字 s 。请你返回按下述规则将其减少到 1 所需要的步骤数:

  • 如果当前数字为偶数,则将其除以 2 。
  • 如果当前数字为奇数,则将其加上 1 。 题目保证你总是可以按上述规则将测试用例变为 1 。

示例:

示例 1:

输入:s = "1101"
输出:6
解释:"1101" 表示十进制数 13Step 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" 表示十进制数 2Step 1) 2 是偶数,除 2 得到 1 

示例 3:

输入:s = "1"
输出:0

来源:力扣(LeetCode)链接:leetcode-cn.com/problems/nu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


语言:

swift

解析:

解这个题分为几个步骤:

  1. 将二进制字符串拆分成数组;
  2. 对于数组的元素,从后向前遍历,对于等于 0 的那位,除以 2 的操作就是移除最后一位;对于等于 1 的那位,正常进行 +1 操作;
  3. 重复第二步

二进制 +1 的操作,就是从最后一位倒着开始,找为 0 的数字,如果等于 0,把该位置为 1,并把该位到最后的所有 1 都置换为 0。举例如下:

11100111 + 1 = 11101000

如果全部位数都为1,那么就在前面加一个 1。举例如下:

11111 + 1 = 100000

代码如下:

class Solution {
    func numSteps(_ s: String) -> Int {
        var numbers: [Character] = []
        s.forEach { (character) in
            numbers.append(character)
        }
        var stepCount: Int = 0
        while numbers.count > 1 {
            if let last = numbers.last {
                if last == "0" {
                    numbers.removeLast()
                } else if last == "1" {
                    var index = numbers.count - 1
                    var stopCurrentLoop: Bool = false
                    while !stopCurrentLoop && index >= 0 {
                        if numbers[index] == "1" {
                            numbers[index] = "0"
                        } else if numbers[index] == "0" {
                            numbers[index] = "1"
                            stopCurrentLoop = true
                            break
                        }
                        index -= 1
                    }
                    if !stopCurrentLoop && index == -1 {
                        numbers.insert("1", at: 0)
                    }
                }
            }
            stepCount += 1
        }
        return stepCount
    }
}

总结

二进制的基本运算。