十三届蓝桥杯pyhon B组数位排序

时间应该可算做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]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值