时间应该可算做O(n)
用测试网站后测试正确率100%
实现:
设输入数要到13进行排序
要第5位的数设为:m m=5
生成一个1到13的列表list
再生成一个字典
字典生成:
键(key):
从各位值和为1开始一直到
把这个数除第一位以外都算做9的各位值和(比如 13 就算1+9,100就算1+9+9)
设这个常数为k
这样并浪费空间但并不多且保证了该字典包含这个数全部的各位值和
值:
各位值和为对应【有几个数,这些数分别是什么】
比如 在13里各位值和为1的为 1:【2,【1,10】】//2为 2:【2,【2,11】】
然后遍历list
计算各位值和
到对应的字典中的键值对操作
比如 算到1则
1:【0+1,【】append(1)】
算到10:
1:【1+1,【1】append(10)】==1:【2,【1,10】】
遍历结束
在从键为1遍历到k
用m减去每个数位值和的个数
比如:
遍历到1则m-2 m=3
遍历到2则m-2 m=1
遍历到3则m-1 算完后m=0
当第一次m减去每个数位值和的个数为0或负数时结束,就说明第m数就在这个 数位值和里
比如这个例子遍历到3 m就等于0
则就说明 在数位值和为 3的数里
然后 m=1
所以数位值和为3的第1个数就是要的数
再比如 如果我要第4位数
遍历到1则m-2 m=2
遍历到2则m-2 算完后m=0
则就说明 在数位值和为 2的数里
然后 m=2
所以数位值和为2的第2个数就是要的数
思路:
数位值和为1的肯定在最前面然后 2,3……
从1往上开始遍历则后来的数,数值一定比之前的大
比如10数位值和为1他比1大
比如 11数位值和为2 他比2大
比如 20数位值和为2 他比11大比2大
所以只需要直接排在后面即
n=int(input())
m=int(input())
k={}
d=-1
for i in str(n):
d+=1
d=int(str(n)[0])+d*9
for i in range(1,d+1):
k[i]=[0,[]]
def ks(n):
d=0
for i in str(n):
d+=int(i)
return d
for i in range(1,n+1):
k[ks(i)][0]+=1
k[ks(i)][1].append(i)
for i in range(1,d+1):
if (m-k[i][0])<=0:
print(k[i][1][m-1])
break
else:
m-=k[i][0]
可