小C的类二进制拼接问题 | 豆包MarsCode AI刷题
有思路就是最简单的题目
摘要
本文介绍了如何通过解析一个数字的组成,确定将其表示为类二进制数字的最小分割数。类二进制数字是仅包含 0 和 1 的特殊数字,因此我们需要通过分析输入数字中最大的单个数字来求解。本文提供了Python和Go的代码实现,时间复杂度为 。
问题描述
给定一个正整数 ,要求最少需要多少个类二进制数字相加才能得到 。类二进制数字是仅包含数字 0 和 1 的数字。
示例
-
输入:
n = "10101"
输出:1 -
输入:
n = "212"
输出:2 -
输入:
n = "1000000"
输出:1 -
输入:
n = "123456789"
输出:9 -
输入:
n = "9876543210"
输出:9
原理分析
1. 问题本质
类二进制数字相加的最小数量,等同于输入数字中最大的单个数字值。例如:
- 对于输入
212,最大数字为2,因此需要两个类二进制数字相加(如111和101)。 - 对于输入
9876543210,最大数字为9,因此需要九个类二进制数字相加。
2. 解题步骤
- 遍历输入数字的每一位字符。
- 将每一位字符转换为整数,记录其中的最大值。
- 返回最大值,作为需要的类二进制数字数量。
- 注意,ans要初始化为1,避免误判0的情况(0算是一个类二进制数字)
3. 时间复杂度
算法仅需遍历输入字符串一次,时间复杂度为 。
代码实现
Python代码
def solution(n: str) -> int:
"""
计算输入数字 n 最少需要多少个类二进制数字相加才能得到。
类二进制数字是仅包含数字 0 和 1 的数字。
"""
max_num = 1 # 初始化最大数字为 1
for char in n:
max_num = max(max_num, int(char)) # 比较并更新最大值
return max_num
if __name__ == "__main__":
# 测试用例
print(solution("10101") == 1) # 应输出 True
print(solution("212") == 2) # 应输出 True
print(solution("1000000") == 1) # 应输出 True
print(solution("123456789") == 9) # 应输出 True
print(solution("9876543210") == 9) # 应输出 True
Go语言代码
package main
import "fmt"
func solution(n string) int {
maxNum := 1
for i := 0; i < len(n); i++ {
if maxNum < int(n[i]-'0') {
maxNum = int(n[i] - '0')
}
}
return maxNum
}
func main() {
fmt.Println(solution("10101") == 1) // 应输出 true
fmt.Println(solution("212") == 2) // 应输出 true
fmt.Println(solution("1000000") == 1) // 应输出 true
fmt.Println(solution("123456789") == 9) // 应输出 true
fmt.Println(solution("9876543210") == 9) // 应输出 true
}
总结
本文详细解析了如何求解最少类二进制数字拼接问题,通过分析输入数字中的最大值即可高效得出答案。此方法简单高效,适用于大规模数据处理,时间复杂度为 。