小C的类二进制拼图(青训营X豆包MarsCode) | 豆包MarsCode AI 刷题

81 阅读4分钟

小C发现了一种特殊的数字,称为类二进制数字,即仅由数字0和1组成的十进制数。例如,1011100都是类二进制数字,而1123001则不是。现在,小C手上有一个正整数n,他想知道最少需要多少个类二进制数字相加才能得到n


测试样例

样例1:

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

样例2:

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

样例3:

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

样例4:

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

样例5:

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


题目分析

这个问题可以通过分析类二进制数的性质来解决。类二进制数只包含0和1两个数字,因此任何位置上的数字如果不是0就是1。对于给定的一个正整数n(以字符串形式给出),要找到最少的类二进制数之和等于n,关键在于观察n中每一位的最大值。

对于每一个位上的数字,如果它是k (1 ≤ k ≤ 9),那么就需要k个类二进制数在该位上贡献1才能满足条件。这是因为每个类二进制数在该位上只能提供0或1的贡献。所以,对于一个给定的数字n,我们只需要找出它所有位数中最大的数字,这个数字就代表了最少需要多少个类二进制数相加才能得到n。

根据这个思路,我们可以直接遍历字符串n,找出其中的最大数字,这个最大数字就是答案。

下面是基于上述逻辑的Python代码实现:

def minNumberOfBinaryNumbers(n: str) -> int:
    # 遍历字符串n,找到最大的数字
    max_digit = max([int(digit) for digit in n])
    return max_digit

# 测试样例
print(minNumberOfBinaryNumbers("10101"))  # 输出:1
print(minNumberOfBinaryNumbers("212"))    # 输出:2
print(minNumberOfBinaryNumbers("1000000"))# 输出:1
print(minNumberOfBinaryNumbers("123456789"))# 输出:9
print(minNumberOfBinaryNumbers("9876543210"))# 输出:9

这段代码首先定义了一个函数minNumberOfBinaryNumbers,它接受一个字符串参数n,并返回最少需要多少个类二进制数相加才能得到n。函数内部,我们通过列表推导式将字符串n中的每个字符转换为整数,并使用内置函数max找到这些数字中的最大值,最后返回这个最大值作为结果。这样就能高效地解决问题。

解题心得

这道题目看似复杂,实则通过简单的数学分析就能快速找到解题的关键点。问题的核心在于理解类二进制数字的特性以及如何通过它们的组合来构造任意给定的正整数n。这里有几个重要的学习点:

  1. 简化问题:面对复杂的问题时,尝试将其分解成更简单、更易于处理的部分。在这个例子中,通过关注每个位上的数字,可以将原问题简化为求解每位数字的最大值问题。

  2. 利用数据结构:本题中使用了列表推导式来快速处理字符串中的每个字符,将其转换为整数并计算最大值。这是Python中一种非常高效且简洁的数据处理方式,值得在类似场景下借鉴。

  3. 算法效率:此解决方案的时间复杂度为O(m),其中m是字符串n的长度。这是因为我们需要遍历整个字符串一次来确定最大值。这种线性时间复杂度对于大多数实际应用来说已经足够高效。

  4. 思考边界情况:虽然测试用例没有特别强调,但在设计算法时考虑边界情况总是很重要的。比如,当输入是一个非常大的数时,确保算法能够正确处理而不超出内存限制或导致其他错误。

  5. 代码可读性和维护性:编写清晰、易于理解的代码同样重要。在上面的示例中,通过使用列表推导式和内置函数max,代码不仅保持了简洁性,也提高了可读性。这有助于未来的维护和扩展。

通过这样的练习,不仅可以提高解决问题的能力,还能加深对编程语言特性的理解和运用,为解决更复杂的问题打下坚实的基础。