440. 字典序的第K小数字

注意数字越界。
十叉树的前序遍历问题。
十叉树的节点值:1的孩子有10,11.....19,10的孩子有100,101,102...109。
cur指向当前节点值。
高效办法是,计算以cur为根的子树的节点个数,就可以知道往右走还是往子树走了。
计算节点值的方法是按层计算。

class Solution {
    public int findKthNumber(int n, int k) {
           
           k--;
           long cur=1;
           long next=cur+1;
           while(k>0){ 
               int count=0;
               long left=cur;
               long right=next;
               while(left<=n){//计算以left为前缀的子树的节点个数
                   count+=Math.min(n+1,right)-left;
                   left*=10;
                   right*=10;
               }
               
               if(k-count>=0){
                   k=k-count;
                   cur=next;
                   next=cur+1;
               }
               else{
                   k--;
                   cur=cur*10;
                   next=cur+1;
               }
           }
           return  (int)cur;      
    }

}
posted @ 2021-08-16 00:01  wsshub  阅读(44)  评论(0)    收藏  举报