Algorithm 找到第k个好数字

Algorithm 找到第k个好数字,algorithm,math,data-structures,Algorithm,Math,Data Structures,最近,在一次竞争性编码考试中,我得到了这个问题- 一个好的数是其数字之和可以被5整除的数。示例-5(5)、14(1+4)、19(1+9)、23(2+3) 问题是-向您提供了一个整数n和另一个整数k,您必须找到第k个大于n的好数字 约束-1可能您的数字算法太耗时了?试试这个: def digits(n): sum = 0 while n: n, r = divmod(n, 10) sum += r return sum def solve(n,k): n+=1

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

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

问题是-向您提供了一个整数
n
和另一个整数
k
,您必须找到第k个大于n的好数字


约束-
1可能您的数字算法太耗时了?试试这个:

def digits(n):
  sum = 0
  while n:
    n, r = divmod(n, 10)
    sum += r
  return sum
  
def solve(n,k):
  n+=1
  count = 0
  while count<k:
    if digits(n)%5==0:
      count+=1
    n+=1
  return n-1
def数字(n):
总和=0
而n:
n、 r=divmod(n,10)
总和+=r
回报金额
def解算(n,k):
n+=1
计数=0

当计数时,让我们从一个简单的问题开始:

  • 我给你一个连续五个数字的列表。这些数字中有多少可以被5整除?(我不是说数字的和,只是数字,比如18,19,20,21,22
  • 没问题,对吧?所以有一个稍微不同的问题:

  • 在十个连续数字的列表中,有多少个可以被5整除
  • 还是很简单,不是吗?现在让我们看看你的“好”数字。我们将首先介绍函数digit\u sum(n),它是n中数字的总和。现在,我们不需要编写该函数;我们只需要知道它的存在。还有一个简单的问题:

  • 如果n是一个不以数字9结尾的数字,而s是数字总和(n),那么什么是数字总和(n+1)?(如果不清楚,请尝试几个数字。)(附加问题:为什么最后一个数字是9很重要?或者换一种说法,除了9之外的其他数字在最后一个不重要?9有什么特别之处?)
  • 好的,差不多了。让我们把这两个想法放在一起:

  • 假设n以0结尾。十个数字中有多少可以被5整除?(见问题2)

  • 这是否有助于您快速计算n之后的第k个好数字?希望答案是肯定的。现在您只需要稍微概括一下。

    这是一个数字动态程序,可以回答从1到参数
    k
    可以找到多少这样的数字。该函数使用
    O(num\u digits)
    搜索空间。我们可以使用它通过二进制搜索来搜索
    k
    th个好数字

    通常的想法是,在
    i
    th位置包含数字
    d
    ,并且到目前为止前缀mod 5为
    mod1
    的好数字的数量等于具有互补mod的有效数字后缀的计数,
    mod2
    ,因此
    (mod1+mod2)mod 5=0

    JavaScript代码与暴力比较:

    函数getDigits(k){
    常量结果=[];
    while(k){
    结果:推力(k%10);
    k=~(k/10);
    }
    返回result.reverse();
    }
    功能g(i、mod、isK、ds、备忘录){
    常量键=字符串([i,mod,isK]);
    if(备注hasOwnProperty(键))
    返回备忘录[键];
    设结果=0;
    常数max=isK?ds[i]:9;
    //个位数
    if(i==ds.length-1){
    
    对于(让j=0;jI认为我们必须考虑一些新的东西,而不是本机方法,可能是你的更快,但它也会看到在O(n)@PankajSharma中你不能这样做的限制是的,你是对的,这仍然是一个微不足道的问题solution@PankajSharma我希望这能有所帮助?这是一种数字划分问题?将n视为(x)[0],x[1],…,x[k]),求出x[0]+…+x[k]=5或x[0]+…+x[k]=10或x[0]+…+x[k]=15的解的个数,依此类推…@PankajSharma,或者方程x1+x2+…+xn=k的非负积分解的个数由(n+k-1)!/(n-1)给出!*k!?使用它应该可以跳过一些候选号码。我现在仍然没有明确的线索。添加了一个数字动态规划的答案。
    input: n = 5, k = 1
    output: 14
    Explanation: 5 is 1st good number but we need greater than 5 so ans is 14
    
    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
    
    def digits(n):
      sum = 0
      while n:
        n, r = divmod(n, 10)
        sum += r
      return sum
      
    def solve(n,k):
      n+=1
      count = 0
      while count<k:
        if digits(n)%5==0:
          count+=1
        n+=1
      return n-1