題目:輸入數字 n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1、2、3 一直到最大的 3 位數 999。
示例 1:
輸入: n = 1
輸出: [1,2,3,4,5,6,7,8,9]
說明:用返回乙個整數列表來代替列印
n 為正整數
首先我們可以看出當n為1時,輸出最大為9;當n為2時,輸出最大為99;當n為3時,輸出最大為999;以此類推,我們可以得知輸入n時,輸出最大數為(10^n)-1;
當 n較大時,輸出最大值會超出 int32整型的取值範圍,超出取值範圍的數字無法正常儲存。不過題目函式的返回值是int型別,所以是預設不考慮大數問題的,因此我們只需用for迴圈就能輕鬆ac本題。
**如下:
class
solution
return v;}}
;執行用時:12 ms, 在所有 c++ 提交中擊敗了71.28
%的使用者
記憶體消耗:11.1 mb, 在所有 c++ 提交中擊敗了54.27
%的使用者
當要考慮大數問題時,這道題的難度就陡公升了幾個等級,絕對不是簡簡單單的for迴圈就能解決問題的。下面來學習一下力扣大佬是如何在考慮大數問題的前提下精彩的ac的。
首先要考慮到當n很大的時候(比如100),列印出來的數很有可能是超過了int_max的範圍的,所以我們用字串來表示每個數。
當然,在這一題中,由於返回的是乙個 int 型的陣列,所以是不可能超過int_max的,但是一般大數問題都不會要求返回 int 陣列來儲存每一位數,而是迴圈輸出每一位數。
我們的思路就是,假設 n = 3,就定義乙個字串,初始化為 「000」,然後用它來迴圈模擬從1到最大的n位數,並迴圈儲存到 int 陣列中(在真實情況下則是迴圈輸出)。
知識點擴充套件:char與int之間的加減法(比如 1 + 『0』 和 『1』 - 『0』)
首先我們看一下ascii表,會發現紅框部分是int型[0, 9]的char值[48, 57],它們是連在一起的。
所以,如果我們用乙個char與乙個int相加,我們會得到乙個char。比如:『0』 + 1 = 48 + 1 = 49 = 『1』。
如果我們用乙個char減去另乙個char,我們會得到乙個int。比如:『2』 - 『0』 = 50 - 48 = 2。
所以,如果我們想把乙個int型的數(比如 i = 5)轉成char型,我們可以寫成:char c = i + 『0』;。
如果我們想把乙個char型的數(比如 c = 『5』)轉成int型,我們可以寫成:int i = c - 『0』。
**如下:
class
solution
bool
overflow
(string& s)
}else
}return isoverflow;
}void
inputnumbers
(string s)
output.
push_back
(stoi
(temp));}};
當考慮了大數為前提後,說實話這道題是真的難,看完大佬的解法後還是有點懵的,不知道他們是如何想出這種解法的,膜拜一下大佬。同時感覺自己和大佬的差距不是一點半點啊,革命尚未成功,同志仍需努力!!!mark一下這道題的解法,二刷的時候還得重新好好理解一下,看看到時候能秒掉它。大家共勉吧!!! 列印從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比較慢...