列印從1到最大的n位數

2021-10-13 22:18:27 字數 2256 閱讀 5090

示例 1:

輸入: n = 1

輸出: [1,2,3,4,5,6,7,8,9]

說明:用返回乙個整數列表來代替列印

n 為正整數

2.1  思路分析

題目假定了返回的是int陣列,故不存在大數越界問題,那麼只需要返回儲存1 ~ (10^n - 1)的陣列即可;

2.2  **實現

class solution 

return res;

}}

2.3  複雜度分析

3.1  思路分析

規定返回型別為字串,因為當 n 足夠大時,10^n - 1超過int型的範圍,故用字串來儲存從1到最大的n位數;

詳解參考:

3.2  獲取從0到最大n位數的排列

class solution ;

char num;

int n;

stringbuilder res = new stringbuilder();

public string printnumbers(int n)

//該方法的作用是固定當前位

public void dfs(int x)

for(char i : loop) }

public static void main(string args)

}

3.3  列印從1到最大的n位數(返回字串)

上面的**存在兩個問題:①當n = 2時,列印00 01 02 ... 99,高位的0應該去掉;②此方法從0開始,題目要求從1開始;

解決①的方法:定義變數start來表示字串的左邊界,例如n = 2時,00 ~09時start = 1,10~99時start = 0;

那麼start的變化規律是什麼?現在我們來看兩個示例:①n = 2時,00 ~09時start = 1,10~99時start = 0;②n = 3時,000~009時start = 2,010~099時start = 1,100~999時start = 0;

定義變數ninecount表示乙個組合(比如009)中9的數量,通過示例可以發現:start = n - ninecount,也就是說當這個條件滿足時,以n = 3為例,說明當前數為009,在到下乙個010之前,將start--;

利用迴圈從高位向低位固定字元時,每固定乙個高位字元,就要將ninecount回溯到固定之前的數值,因為每個高位字元之間是並列的關係;

解決問題②的方法:新增數字字串的時候判斷是否為"0",是就直接跳過。

class solution ;

char num;

int n;

int start;

int ninecount = 0;

stringbuilder res = new stringbuilder();

public string printnumbers(int n)

//該方法的作用是固定當前位

public void dfs(int x)

for(char i : loop)

ninecount--; }

public static void main(string args)

}

3.4  列印從1到最大的n位數(返回int)

因為題目要求是返回 int 陣列,其預設不存在大數問題,但我們用大數的方法完全可以解決非大數的問題;

可以在新增數字字串s之前,將其轉換為int型別;

class solution ;

char num;

int n;

int start;

int count = 0;

int ninecount = 0;

int res;

public int printnumbers(int n)

//該方法的作用是固定當前位

public void dfs(int x)

for(char i : loop)

ninecount--; }

public static void main(string args)

}}

列印從1到最大的n位數

題目 輸入數字n,順序列印從1到最大n位的十進位制數,例如輸入3,列印1到999 includebool increment char number void printnumber char number void printtomaxofndigitsrecursively char numbe...

列印從1到最大的n位數

void print1tomaxofndigits int n 上面的 有個最嚴重的問題 沒有關注n的範圍 當輸入的n很大時,我們求最大的n位數用int或者long long都會溢位。也就是我們需要考慮大數問題。因為數字最大是n位,所以我們需要用乙個長度是n 1的字串 字串最後一位放 0 當實際的數...

列印從1到最大的n位數

題目 輸入數字n,按順序列印出從1最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999。思路 首先注意這是個大數問題,n很大的時候c 的int和long long都吃不消,所以數字的儲存要用字串 這裡我模擬了大數相加,只不過每次都是加1 另外要注意列印的問題,cout比較慢...