字典序的第K小数字(十叉树的先序遍历)
题目链接:
https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order/
题目大意:
给定整数 n
和 k
,找到 1
到 n
中字典序第 k
小的数字。
注意:1 ≤ k ≤ n ≤ 109。
具体思路:
首先遍历的思路和这个题是类似的,https://www.cnblogs.com/letlifestop/p/11197694.html 。然后对于这个题,肯定不能一步一步的找到这个数。因为是字典序,我们可以把这些数构造成一个树,一个十叉树。然后顺序遍历找到第k个就好了。
AC代码:
1 class Solution { 2 public: 3 long long findKthNumber(long long n, long long k) { 4 long long cur = 1; 5 k--; 6 while(k>0){ 7 long long step = 0; 8 long long tmp = cur , nex = tmp + 1 ; 9 while(tmp <= n){ // 先找到这个数是在以哪个节点为根节点的树上。 10 step += min(nex,n+1) - tmp; 11 nex *= 10; 12 tmp *= 10; 13 } 14 if(step <= k){k -= step;cur++;} //这个时候横向增加 15 else {cur *= 10;k--;} // 这个时候需要往下走一个节点。 16 } 17 return cur; 18 } 19 };