题目
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。
注意:1 ≤ k ≤ n ≤ 109。
示例 :
输入:
n: 13 k: 2
输出:
10
解释:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
解题思路
看了题解做出来的。。感觉没有想得很明白。
按照字典序排序,以数字i
开头的数字,一定在排在以数字i + 1
开头的数字之前,即:11xxx
一定排在12x
之前。
画成1个十叉树,差不多是这样:
思路是,计算以prefix
为前缀的数字个数,记为n
,如果k > n
,则说明当前第k个数字在prefix
的右边,如果k <= n
,则说明第k个数字在prefix
为根节点的子树上
代码
class Solution:
def get_count(self, prefix: int, n: int) -> int:
next_prefix = prefix + 1
count = 0
while prefix <= n:
count += (min(n + 1, next_prefix) - prefix)
prefix *= 10
next_prefix *= 10
return count
def findKthNumber(self, n: int, k: int) -> int:
p = 1
prefix = 1
while p < k:
count = self.get_count(prefix, n)
if p + count > k:
prefix *= 10
p += 1
else:
prefix += 1
p += count
return prefix