小C的好数 | 豆包MarsCode AI 刷题
小C对“好数”非常感兴趣,她定义一个不含前导零的正整数为“好数”,如果它的所有数位最多包含两种不同的数字。例如,数字 23,2323,9,111,和 101 都是好数。现在小C想知道,从1到 ( n ) 之间有多少个好数。本文将探讨如何帮助小C找到从1到 ( n ) 之间的所有好数,并提供详细的代码实现。
问题描述
给定一个正整数 ( n ),目标是计算从1到 ( n ) 之间有多少个好数。一个好数的定义是:不含前导零的正整数,且其所有数位最多包含两种不同的数字。
解决方案
为了帮助小C找到从1到 ( n ) 之间的所有好数,我们可以分以下几个步骤来实现:
- 初始化计数器:
- 使用一个变量
count来记录好数的数量,初始值为0。
- 使用一个变量
- 遍历所有数字:
- 从1到 ( n ) 逐个遍历每个数字。
- 检查每个数字是否为好数:
- 将每个数字转换为字符串,以便于处理其每一位。
- 使用集合
set来获取数字中不同的字符。 - 如果不同字符的数量不超过2,则该数字为好数,计数器加1。
- 返回结果:
- 返回计数器的值,即从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
代码解释
- 初始化计数器:
count变量用于记录好数的数量,初始值为0。
- 遍历所有数字:
- 使用
for循环从1到 ( n ) 逐个遍历每个数字。
- 使用
- 检查每个数字是否为好数:
- 将当前数字
num转换为字符串num_str,以便于处理其每一位。 - 使用集合
set来获取num_str中不同的字符unique_digits。 - 检查
unique_digits的长度是否小于或等于2,如果是,则该数字为好数,计数器count加1。
- 将当前数字
- 返回结果:
- 返回
count的值,即从1到 ( n ) 之间的好数数量。
- 返回
测试样例
- 样例1:
n = 110,输出:102- 解释:从1到110之间,所有的1位数、2位数,以及一些3位数(如 100, 101)都是好数,一共有102个。
- 样例2:
n = 1000,输出:352- 解释:从1到1000之间,所有的1位数、2位数、3位数,以及一些4位数(如 1000, 1001)都是好数,一共有352个。
- 样例3:
n = 1,输出:1- 解释:从1到1之间,只有1个好数,即1。 通过上述方法,我们可以有效地帮助小C找到从1到 ( n ) 之间的所有好数,确保在处理数字时算法的时间复杂度为 ( O(n \times d) ),其中 ( d ) 是数字的位数。