青训营X豆包MarsCode技术训练营|豆包MarsCode AI刷题

1 阅读3分钟

问题描述

小C手中有一个正整数 n,她每次可以删除这个整数中的一位数字。小C想知道,自己最少需要操作多少次才能使得这个整数成为 5 的倍数。


测试样例

样例1:

输入:n = 52
输出:1

样例2:

输入:n = 132
输出:3

样例3:

输入:n = 1234
输出:4

题目不长,看着也不是很困难,但是以防万一我们还是参考一下AI豆包MarsCode提供的思路提示:

问题理解

我们需要找到一个正整数 n 中删除最少位数,使得剩下的数字是 5 的倍数。一个数是 5 的倍数的条件是其最后一位必须是 0 或 5

数据结构选择

我们可以将整数 n 转换为字符串,这样更容易处理每一位数字。

算法步骤

  1. 初始检查:如果 n 本身已经是 5 的倍数,直接返回 0
  2. 遍历每一位:从 n 的最后一位开始向前遍历,检查每一位是否是 0 或 5
  3. 计算删除次数:对于每一位是 0 或 5 的情况,计算删除前面所有数字的次数,并记录最小的删除次数。
  4. 返回结果:返回最小的删除次数。

关键点

  • 从后向前遍历可以减少不必要的计算,因为我们需要的是最后一位是 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) # 增加一个测试用例

算法步骤:

  1. 初始检查:  如果 n 本身能被 5 整除 (n % 5 == 0),直接返回 0。
  2. 字符串转换:  将整数 n 转换为字符串 s
  3. 逆向遍历:  从字符串 s 的最后一位开始向前遍历。
  4. 查找 0 或 5:  遍历过程中,如果遇到 '0' 或 '5',则计算需要删除的位数 (即当前索引之前的位数),并与已找到的最小删除次数进行比较,保留较小值。
  5. 处理找不到 0 或 5 的情况:  如果遍历完成后没有找到 '0' 或 '5',则意味着需要删除所有数字,最小删除次数为字符串长度。
  6. 返回结果:  返回最小删除次数。

这样就能达到题目的要求了。