题目描述
给定一个整数n,请在1到n中找出字典序排序后的第k个数
输入:两个整数n和k
输出:一个整数,表示字典序排序后的第k个数
题目解释
什么是字典序
举例子:当n=15时,把1到15按字典序排序就是1,10,11,12,13,14,15,2,3,4,5,……
当k=6时,就是从1开始数起的第6个,则第k个数为14。
那用算法如何实现?
思路
n会位于哪两个首字之间,先从1开始往后遍历。
如果已经确定了n的首字(比如是1),那从就要从10开始往后遍历,再不够就100,1000……
定义一个函数求两个首字之间的数有几个
#这个函数用来计算个数
def cal_steps(n,n1,n2):
#只有当n1<n时,n才是在n1和n2的中间
steps=0
while n1<=n:
#当它们不是同一个数量级,比如n是15,n1是1的时候
#此时steps是n2和n1之间,steps=steps+n2-n1
#当它们是一个数量级的时候,比如n是15,n1是10的时候
#此时steps是n+1和n1之间,steps=steps+n+1-n1
steps+=min(n+1,n2)-n1
n1*=10
n2*=10
return steps
定义一个函数实现上述的遍历
def the_kth_number(n,k):
#首字从1开始遍历
num=1
#从1开始,所以k已经走了一位,减一
k=k-1
while k>0:
steps=cal_steps(n,num,num+1)
if steps<=k:
#首字往下一位遍历
num+=1
#把这里已经遍历的位数减掉
k-=steps
else:
#往下一个数量级遍历
num*=10
k-=1
return num
最终算法
n,k=map(int,input().split())
def cal_steps(n,n1,n2):
steps=0
while n1<=n:
steps=steps+min(n2,n+1)-n1
n1*=10
n2*=10
return steps
def the_kth_number(n,k):
num=1
k=k-1
while k>0:
steps=cal_steps(n,num,num+1)
if steps<=k:
num+=1
k-=steps
else:
num*=10
k-=1
return num
ans=the_kth_number(n,k)
print(ans)