n位数的全排列(需要考虑大数的情况)
文章目錄
- 題目
- 思路
- 代碼
題目
輸入數字 n,按順序打印出從 1 到最大的 n 位十進制數。比如輸入 3,則打印出 1、2、3 一直到最大的 3 位數 999。
示例 1:
輸入: n = 1
輸出: [1,2,3,4,5,6,7,8,9]
說明:
用返回一個整數列表來代替打印
n 為正整數
來源:力扣(LeetCode)
思路
在力扣里這道題不用考慮大數。但是還是想自己寫一個以備不虞。
重點:
細節:
-
第一點無需贅述。
-
關于第二點:
我們知道 string 每一位下標對應的元素其類型都是 char 的(字符串由字符組成嘛)。
那代碼實現應該怎么寫呢?是這樣嗎?
s[digit] = (char)i;答案是否定的。來看這么一段代碼:
可以看到輸出結果不是4,而是52。
簡單的 (char)i 起到的作用是將 i 變為 ASCII碼為i的字符,上圖中,因為字符’4’ 的ASCII碼為52,因此 char(52) 會得到 字符'4'。
換言之,s[digit] = (char)i; 得到的是 ASCII碼為i時對應的字符 ,而非 字符'i'。
正確處理 int 轉 char 應為(例如:將整數4轉換為字符4):
上圖代碼的本質也就是 0的ASCII碼(48)+4 得到 ASCII碼52,其對應的字符便是 '4'。
值得一提的是,通過 + '0' 將 int 轉換為 char 并非總是可行的。當整數大于9時, + '0' 操作得到的便不再是數字字符了:
當然對于本題來講并不存在這樣的問題,因為我們僅僅是轉換每個數位上的數字(它們在0~9之間)。
- 關于第三點,也是本題最重要的部分:
全排列思想如下圖所示(圖源大佬:jyd):
代碼中用 dfs函數 實現:
代碼
class Solution {vector<int> iv;void dfs(int n, int digit, string& s){if(n == digit){ // 位數處理完畢int val = std::stoi(s);if(val){iv.push_back(val); }return;}for(int i = 0; i < 10; i++){s[digit] = i + '0'; // int -> chardfs(n, digit+1, s);}} public:vector<int> printNumbers(int n) {string s(n, '0');dfs(n, 0, s);return iv;} };總結
以上是生活随笔為你收集整理的n位数的全排列(需要考虑大数的情况)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【译】PGS字幕
- 下一篇: java使用三种循环打印99表_编程题: