162 好数 | 豆包Marscode AI 刷题

43 阅读3分钟

题目回顾

image.png

题目分析

对于这个问题,其核心在于确定给定范围内的 “好数” 数量。具体的方法是通过依次遍历从 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