字典序排序

主要是关于LeetCode当中的字典序排序问题

  • 386 Lexicographical Numbers
  • 440 字典序的第K小数字
  • 524 通过删除字母匹配到字典里面最长单词
  • 361 去除重复字母使得剩下的字典排序最小的情况

386 字典序排序算法

Given an integer n, return 1 - n in lexicographical order.

For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].

给 30
1,10,11,12,13,14,15,16,17,18,19, 2,20,

解决步骤

  1. 先争取*10,看是否满足
  2. 末尾小于9,不是9 (取余操作),满足++1操作
  3. 回退操作, 处理末尾为9 ,在这里面还要处理一个就是连续的末尾为9,比如 49999, 最终要处理成为49

// 49999 49 这两种方式都要处理成为 5 , 只是对应的n 取值不是一样的基本情况

Given an integer n, return 1 - n in lexicographical order.

For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].

非stack 方法

public class Solution{
   public List<Integer> sloved(int n){
   List<Integer> result =new LinkedList<>();
        if(n==0) return result;
        int current =1;
        // 0````00 一共有n 位可以取值的基本情况
        for(int i=1;i<=n;i++){
            result.add(current);
            // 如果可以一直*到10000000000, 1位
            
            if(current*10<=n){
            //  在后面加一个10,, 比如1 ,n=10, 我们就可以10 
                
                // 1, 10 
                current *=10;
            }
            //以数字9结尾的数字不能进行++操作,等基本概念
            // ++1 的边界条件
            else if (current+1<=n && current%10!=9) {
                current++;
            }
            // 进行回退操作  比如 n=550, 现在是499 ,不能加1操作, 加1就是500 漏了5这些
            // 所以需要进行一个回退操作
            // 将499这样的数据进行回退, 449  转变成为5  499, 49  
            // 897  89 
            else{
                // 处理连续的9999   比如 499999 最终进过while 循环变成49的基本情况
                while((current/10)%10==9)
                {
                    current /=10;
                }
                // while 循环只能把499 变换我49 ,最后我们还是需要最后一步进行处理
                //将49转换为5
                // 
                current = current/10 +1;
            }
            
        }
        return result;
    }
   }
}

DFS

class Solution {
    public List<Integer> lexicalOrder(int n) {
        List<Integer> result =new LinkedList<>();
        if(n==0) return result;
        // 所有的数字
        // 分别从1,2,3,4,5,6,7,8 9,这些数字开回溯
//For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].

        for(int i=1;i<10;i++){
            dfs(n,i,result);
        }
        return result;
    }
    private void dfs(int n, int current, List<Integer> result){
        // 剪纸的基础条件情况
        if(current>n)
            return;
    
        result.add(current);
        current *=10;
        for(int i=0;i<10;i++){
                // 进一步进行深度有效搜索
               if(current+i>n)
                    return;
              dfs(n,current+i,result);
            
        }
    }
    
}

你可能感兴趣的:(Leetcode,字典序)