小C的类二进制拼接问题 | 豆包MarsCode AI刷题

82 阅读3分钟

小C的类二进制拼接问题 | 豆包MarsCode AI刷题

小C的类二进制拼图 - MarsCode

有思路就是最简单的题目

摘要

本文介绍了如何通过解析一个数字的组成,确定将其表示为类二进制数字的最小分割数。类二进制数字是仅包含 01 的特殊数字,因此我们需要通过分析输入数字中最大的单个数字来求解。本文提供了Python和Go的代码实现,时间复杂度为 O(n)O(n)

问题描述

给定一个正整数 nn,要求最少需要多少个类二进制数字相加才能得到 nn。类二进制数字是仅包含数字 01 的数字。

示例

  • 输入:n = "10101"
    输出:1

  • 输入:n = "212"
    输出:2

  • 输入:n = "1000000"
    输出:1

  • 输入:n = "123456789"
    输出:9

  • 输入:n = "9876543210"
    输出:9

原理分析

1. 问题本质

类二进制数字相加的最小数量,等同于输入数字中最大的单个数字值。例如:

  • 对于输入 212,最大数字为 2,因此需要两个类二进制数字相加(如 111101)。
  • 对于输入 9876543210,最大数字为 9,因此需要九个类二进制数字相加。

2. 解题步骤

  1. 遍历输入数字的每一位字符。
  2. 将每一位字符转换为整数,记录其中的最大值。
  3. 返回最大值,作为需要的类二进制数字数量。
  4. 注意,ans要初始化为1,避免误判0的情况(0算是一个类二进制数字)

3. 时间复杂度

算法仅需遍历输入字符串一次,时间复杂度为 O(n)O(n)

代码实现

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
}

总结

本文详细解析了如何求解最少类二进制数字拼接问题,通过分析输入数字中的最大值即可高效得出答案。此方法简单高效,适用于大规模数据处理,时间复杂度为 O(n)O(n)