难度:
中等
描述:
给你一个以二进制形式表示的数字 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
来源:力扣(LeetCode)链接:leetcode-cn.com/problems/nu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
语言:
swift
解析:
解这个题分为几个步骤:
- 将二进制字符串拆分成数组;
- 对于数组的元素,从后向前遍历,对于等于 0 的那位,除以 2 的操作就是移除最后一位;对于等于 1 的那位,正常进行 +1 操作;
- 重复第二步
二进制 +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
}
}
总结
二进制的基本运算。