AI刷题-最大关键数查找 | 豆包MarsCode AI刷题

49 阅读3分钟

最大关键数查找

问题描述

小M拿到了一些整数,他定义“关键数”为至少能被其一位数字整除的数。换句话说,如果一个数的某一位数字可以整除该数本身,则称该数为关键数。

现在,给定一个整数 N,小M想从 1N 的所有整数中找到一个最大的关键数,并返回它。

例如,当 N499 时,最大的关键数是 496,因为 496 可以被其十位数字 4 整除。


测试样例

样例1:

输入:N = 499
输出:497

样例2:

输入:N = 1000
输出:1000

样例3:

输入:N = 785
输出:785


解题思路

  • 关键数定义:判断一个数是否为关键数,即判断这个数是否可以被其中任意一位数字整除。
  • 对于一个数 xxx,将其转换为字符串,然后遍历每一位数字 ddd:
    • 如果 d≠0d \neq 0d=0 且 xmodd=0x \mod d = 0xmodd=0,则 xxx 为关键数。
  • 从大到小查找:从 NNN 开始向下查找,一旦找到满足条件的数即返回。这样可以保证找到的第一个符合条件的数就是最大的关键数。
  • 特殊情况:数字中可能出现 000,我们需要跳过它,以避免除以零的错误。

代码实现

def largest_key_number(N: int) -> int:
    # 从 N 开始向下查找
    for num in range(N, 0, -1):
        # 将数字转换为字符串以便逐位检查
        str_num = str(num)
        is_key_number = False
        
        # 检查当前数字的每一位
        for char in str_num:
            digit = int(char)
            # 跳过 0,因为不能被 0 整除
            if digit != 0 and num % digit == 0:
                is_key_number = True
                break
        
        # 如果找到关键数,则返回该数
        if is_key_number:
            return num

# 测试用例
print(largest_key_number(499))  # 输出:497
print(largest_key_number(1000)) # 输出:1000
print(largest_key_number(785))  # 输出:785

解释

  • 遍历范围:使用从 NNN 到 111 的倒序循环,保证第一个满足条件的数是最大的关键数。
  • 位数检查:通过将数字转换为字符串并逐位检查是否满足条件。
  • 时间复杂度:从 NNN 开始逐步减少,因此时间复杂度为 O(N)O(N)O(N),在每一轮检查中,转换位数和取模运算的开销是常数时间。

模板答案

def solution(N: int) -> int:
    # 从 N 开始向下查找
    for num in range(N, 0, -1):
        # 将数字转换为字符串以便逐位检查
        str_num = str(num)
        is_key_number = False
        
        # 检查当前数字的每一位
        for char in str_num:
            digit = int(char)
            # 跳过 0,因为不能被 0 整除
            if digit != 0 and num % digit == 0:
                is_key_number = True
                break
        
        # 如果找到关键数,则返回该数
        if is_key_number:
            return num

if __name__ == '__main__':
    print(solution(N=499) == 497)   # 输出: True
    print(solution(N=1000) == 1000) # 输出: True
    print(solution(N=785) == 785)   # 输出: True