algorithm - 找到第 k 个好数

标签 algorithm math data-structures

最近,在竞争性编码考试中,我得到了这个问题 -

一个好数字是指其数字之和能被 5 整除的数字。示例 - 5 (5), 14 (1+4), 19(1+9), 23(2+3)

问题是——你得到了一个整数 n和另一个整数 k你必须找到大于 n 的第 k 个好数。

约束 - 1<k<10^9

样本测试 1 -

input: n = 6, k = 5
output: 32
Explanation: After 6 good numbers are  - 14, 19, 23, 28, 32 (5th is 32)

样本测试 2 -

input: n = 5, k = 1
output: 14
Explanation: 5 is 1st good number but we need greater than 5 so ans is 14

我已经尝试使用 native 方法,即对于每个大于 n 的数字,检查它是否正确并循环直到我找到 k 个正确的数字,这是我的代码 -

def solve(n,k):
    n+=1
    count = 0
    while count<k:
        if sum(map(int,str(n)))%5==0:
            count+=1
        n+=1
    return n-1

但上面的代码给了我 TLE,如何以更好的时间复杂度来完成它,我在互联网上搜索过类似的问题但无法找到帮助。

最佳答案

让我们从一个简单的问题开始:

  1. 我给你一个包含五个连续 数字的列表。这些数字中有多少可以被 5 整除? (我不是在谈论数字的总和。只是数字,例如 18、19、20、21、22。

没问题吧?所以一个稍微不同的问题:

  1. 在十个连续数字的列表中,有多少个可以被 5 整除?

仍然很简单,不是吗?现在让我们看看你的“好”数字。我们将从介绍函数 digit_sum(n) 开始,它是 n 中数字的总和。现在,我们不需要编写那个函数;我们只需要知道它存在。这是另一个简单的问题:

  1. 如果 n 是一个不以数字 9 结尾的数字并且 sdigit_sum(n ),什么是 digit_sum(n+1)? (如果不是很清楚,请尝试几个数字。)(额外问题:为什么最后一位数字是 9 很重要?或者换句话说,为什么末尾不是 9 的数字不重要? 9 有什么特别之处?)

好的,差不多了。让我们把这两个想法放在一起:

  1. 假设n以0结尾,十个数digit_sum(n)中有多少个,digit_sum( n+1), digit_sum(n+2), ... digit_sum(n+9) 能被 5 整除? (见问题 2)。

这是否能帮助您找到一种快速计算 n 后第 k 个好数的方法?希望答案是肯定的。现在您只需要概括一下。

关于algorithm - 找到第 k 个好数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63975216/

相关文章:

c++ - 嵌套 map 结构创建空 map

c# - 如何获得一组数字的所有组合,这些数字加起来等于或仅略高于一组数字?

java - 我如何获得此代码挑战中此测试用例的结果?

java - 将一串字符分解为有效的单词

具有相同键的 Python 字典

math - 如何从两个唯一的 GUID(顺序无关紧要)生成唯一的 GUID

javascript - 计算圆度

在单个时钟周期内执行的verilog中的余数运算算法

algorithm - 计划一个和平的聚会

c++ - 四元数和旋转轴