17. 打印從1到最大的n位數,全排列

17. 打印從1到最大的n位數

image.png
注意!需考慮大數數組

思路:

  • n位數須要輸出1~10^n-1
  • 當須要考慮大數時,用int類型不能包含全部狀況,所以須要用字符數組的全排列來獲得。
  • 兩位數須要兩層for循環來獲得十位和個位的排列組合,n層for循環用遞歸代替
  • 字符數組轉換爲int類型:this

    字符數組--字符串(String)--int
      ----s = String.valueOf(num)----Integer.parseInt(s)
  • 用遞歸表示多層for:具體spa

    void def(int n){
      if(){
         ...
         return;
      }
      for(xxx){
      
        def();在for循環中調用本身
      }
    }
  • 去零。全排列的結果沒法避免地會出現[001,002,003...]而不是題目所須要的[1,2,3,...,999]code

    • 結果中的某一個數的位數和9的個數和n的關係有:
    輸入n 此時的數 此時該數的位數 subString(start)中的start 9的個數nine
    2 09 1 1 1
    3 009 1 2 1
    3 099 2 1 2

    獲得結論:遞歸

    n  = start + nine

    ,所以在知足以上條件時,須要擴大子字符串的範圍,即start--字符串

    • 計算 nine。是在for裏計算的,同時 計算了09,變20時跳出個位的循環,須要nine-1,不能影響後面20的時候,nine應該是0,而不是1。

操做:

public class Solution {
    char[] arr = {'0','1','2','3','4','5','6','7','8','9'};
    int n;
    int[] res;
    char[] num;
    int nine,start, k =0;
    public int[] printNumbers(int n){
        this.n = n;
        res = new int[(int) Math.pow(10,n)-1];
        num = new char[n];
        start = n-1;
        def(0);
        return res;
    }
    public void def(int x){

        if (x == n){
            String s = String.valueOf(num).substring(start);
            if(s.equals("0")) return;
            res[k] = Integer.parseInt(s);
            k++;
            if (n-start == nine) start--;
            return;
        }
        for (char a :
                arr) {
            if (a=='9') nine++;
            num[x] = a;
            def(x+1);
        }
        nine--;
    }
}

d25string

相關文章
相關標籤/搜索