最大关键数查找
问题描述
小M拿到了一些整数,他定义“关键数”为至少能被其一位数字整除的数。换句话说,如果一个数的某一位数字可以整除该数本身,则称该数为关键数。
现在,给定一个整数 N,小M想从 1 到 N 的所有整数中找到一个最大的关键数,并返回它。
例如,当 N 为 499 时,最大的关键数是 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