python排序——求按字典序排序的第k个数

题目描述

给定一个整数n,请在1到n中找出字典序排序后的第k个数

输入:两个整数n和k

输出:一个整数,表示字典序排序后的第k个数

题目解释

什么是字典序

设想一本英语字典里的单词,何者在前何者在后?显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

举例子:当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)

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值