题目回顾
题目分析
对于这个问题,其核心在于确定给定范围内的 “好数” 数量。具体的方法是通过依次遍历从 1 到 n 的每一个整数来进行判断。在遍历过程中,首先将当前整数转换为字符串形式,这是因为以字符串形式处理数字的各个数位会更加方便。
接着,对于每一个整数,逐个检查其每个数位上的数字。在检查过程中,通过统计不同数字的种类来判断该整数是否为 “好数”。具体的操作是,在遍历整数的每个数位时,将当前数位上的数字添加到一个集合中。由于集合的特性是不允许重复元素存在,所以最终集合中元素的个数就代表了不同数字的种类数量。
如果在遍历完一个整数的所有数位后,发现不同数字的种类数量不超过两种,那么就可以判定这个整数是一个 “好数”。此时,相应地增加 “好数” 的计数。例如在上述代码示例中,通过一个 for 循环依次遍历每个整数,在内部又通过一个内层 for 循环来遍历该整数的每个数位字符。在内层循环中,利用集合来统计不同的数位数字,根据集合元素个数判断是否为 “好数”。这种方法能够有效地筛选出满足条件的 “好数”,并准确地统计出 “好数” 的数量。通过这样的分析,可以看出这个问题的解决思路清晰,通过合理地利用循环和集合等数据结构,能够高效地完成任务。
代码实现
def solution(n: int) -> int:
count = 0
for i in range(1, n + 1):
num_str = str(i)
digit_set = set()
for digit in num_str:
digit_set.add(digit)
if len(digit_set) > 2:
break
else:
count += 1
return count
if __name__ == '__main__':
print(solution(110) == 102)
print(solution(1000) == 352)
print(solution(1) == 1)
函数分析
代码实现细节
变量定义:
count:初始化为0,用于记录满足条件的整数的个数。
循环逻辑:
-
外层循环:
- 通过
for i in range(1, n + 1)遍历从1到n的所有整数。对于每个整数i,会进行进一步的检查以确定是否满足条件。
- 通过
-
内层循环:
- 首先,将当前整数
i转换为字符串num_str,以便逐个检查其数字字符。 - 然后,创建一个空集合
digit_set,用于存储已经出现过的数字字符。 - 接着,通过
for digit in num_str:循环遍历num_str中的每个数字字符,将其添加到digit_set集合中。 - 在每次添加数字字符到集合后,会检查集合中不同数字字符的数量,如果
len(digit_set) > 2,就使用break语句跳出内层循环,意味着当前整数i不满足条件。 - 如果内层循环完整执行完毕(没有因为
len(digit_set) > 2而提前跳出),则说明当前整数i满足条件,此时会将count的值增加1。
- 首先,将当前整数