Algorithm 找到第k个好数字
最近,在一次竞争性编码考试中,我得到了这个问题- 一个好的数是其数字之和可以被5整除的数。示例-5(5)、14(1+4)、19(1+9)、23(2+3) 问题是-向您提供了一个整数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
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