问题描述
小C手中有一个正整数 n
,她每次可以删除这个整数中的一位数字。小C想知道,自己最少需要操作多少次才能使得这个整数成为 5
的倍数。
测试样例
样例1:
输入:
n = 52
输出:1
样例2:
输入:
n = 132
输出:3
样例3:
输入:
n = 1234
输出:4
题目不长,看着也不是很困难,但是以防万一我们还是参考一下AI豆包MarsCode提供的思路提示:
问题理解
我们需要找到一个正整数 n
中删除最少位数,使得剩下的数字是 5
的倍数。一个数是 5
的倍数的条件是其最后一位必须是 0
或 5
。
数据结构选择
我们可以将整数 n
转换为字符串,这样更容易处理每一位数字。
算法步骤
- 初始检查:如果
n
本身已经是5
的倍数,直接返回0
。 - 遍历每一位:从
n
的最后一位开始向前遍历,检查每一位是否是0
或5
。 - 计算删除次数:对于每一位是
0
或5
的情况,计算删除前面所有数字的次数,并记录最小的删除次数。 - 返回结果:返回最小的删除次数。
关键点
- 从后向前遍历可以减少不必要的计算,因为我们需要的是最后一位是
0
或5
。 - 每次找到一个
0
或5
时,计算删除前面所有数字的次数,并更新最小删除次数。
def solution(n: int) -> int: s = str(n) if n % 5 == 0: return 0 min_ops = len(s)
for i in range(len(s) - 1, -1, -1): # 逆向遍历
if s[i] == '0' or s[i] == '5':
min_ops = min(min_ops, len(s) - 1 - i) # 计算并更新最小删除次数
break # 找到一个满足条件的数字后即可停止遍历
return min_ops
if __name__ == '__main__':
print(solution(52) == 1)
print(solution(132) == 3)
print(solution(1234) == 4)
print(solution(10) == 0)
print(solution(12345) == 0)
print(solution(101) == 2)
print(solution(500) == 0)
print(solution(99999) == 5) # 增加一个测试用例
算法步骤:
- 初始检查: 如果
n
本身能被 5 整除 (n % 5 == 0
),直接返回 0。 - 字符串转换: 将整数
n
转换为字符串s
。 - 逆向遍历: 从字符串
s
的最后一位开始向前遍历。 - 查找 0 或 5: 遍历过程中,如果遇到 '0' 或 '5',则计算需要删除的位数 (即当前索引之前的位数),并与已找到的最小删除次数进行比较,保留较小值。
- 处理找不到 0 或 5 的情况: 如果遍历完成后没有找到 '0' 或 '5',则意味着需要删除所有数字,最小删除次数为字符串长度。
- 返回结果: 返回最小删除次数。
这样就能达到题目的要求了。