小C的好数 | 豆包MarsCode AI 刷题

73 阅读3分钟

小C的好数 | 豆包MarsCode AI 刷题

小C对“好数”非常感兴趣,她定义一个不含前导零的正整数为“好数”,如果它的所有数位最多包含两种不同的数字。例如,数字 23,2323,9,111,和 101 都是好数。现在小C想知道,从1到 ( n ) 之间有多少个好数。本文将探讨如何帮助小C找到从1到 ( n ) 之间的所有好数,并提供详细的代码实现。

问题描述

给定一个正整数 ( n ),目标是计算从1到 ( n ) 之间有多少个好数。一个好数的定义是:不含前导零的正整数,且其所有数位最多包含两种不同的数字。

解决方案

为了帮助小C找到从1到 ( n ) 之间的所有好数,我们可以分以下几个步骤来实现:

  1. 初始化计数器
    • 使用一个变量 count 来记录好数的数量,初始值为0。
  2. 遍历所有数字
    • 从1到 ( n ) 逐个遍历每个数字。
  3. 检查每个数字是否为好数
    • 将每个数字转换为字符串,以便于处理其每一位。
    • 使用集合 set 来获取数字中不同的字符。
    • 如果不同字符的数量不超过2,则该数字为好数,计数器加1。
  4. 返回结果
    • 返回计数器的值,即从1到 ( n ) 之间的好数数量。

代码实现

def solution(n: int) -> int:
    count = 0  # 初始化好数的计数器
    for num in range(1, n + 1):
        num_str = str(num)            # 将数字转换为字符串
        unique_digits = set(num_str)  # 获取数字中不同的字符
        if len(unique_digits) <= 2:   # 如果不同字符数量 <= 2
            count += 1                # 计数器加1
    return count
if __name__ == '__main__':
    print(solution(110) == 102)        # 输出: True
    print(solution(1000) == 352)      # 输出: True
    print(solution(1) == 1)            # 输出: True

代码解释

  1. 初始化计数器
    • count 变量用于记录好数的数量,初始值为0。
  2. 遍历所有数字
    • 使用 for 循环从1到 ( n ) 逐个遍历每个数字。
  3. 检查每个数字是否为好数
    • 将当前数字 num 转换为字符串 num_str,以便于处理其每一位。
    • 使用集合 set 来获取 num_str 中不同的字符 unique_digits
    • 检查 unique_digits 的长度是否小于或等于2,如果是,则该数字为好数,计数器 count 加1。
  4. 返回结果
    • 返回 count 的值,即从1到 ( n ) 之间的好数数量。

测试样例

  • 样例1n = 110,输出:102
    • 解释:从1到110之间,所有的1位数、2位数,以及一些3位数(如 100, 101)都是好数,一共有102个。
  • 样例2n = 1000,输出:352
    • 解释:从1到1000之间,所有的1位数、2位数、3位数,以及一些4位数(如 1000, 1001)都是好数,一共有352个。
  • 样例3n = 1,输出:1
    • 解释:从1到1之间,只有1个好数,即1。 通过上述方法,我们可以有效地帮助小C找到从1到 ( n ) 之间的所有好数,确保在处理数字时算法的时间复杂度为 ( O(n \times d) ),其中 ( d ) 是数字的位数。