一、題目
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
示例2:
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。
二、題解
普通情況:9 以外的數字,直接加 1。
特殊情況:9 加 1,要進位。又分兩種情況:
1)長度不變:如 19 + 1 = 20;
2)長度加 1:如 99 + 1 = 100。
從後向前遍歷,給當前位置加 1 並 取餘,如果取餘後的結果不爲0,說明是上面列出的普通情況;反之則是需要進位的特殊情況,如果遍歷到開頭,取餘的結果仍然是0,則說明數組的長度要加1,用 array_unshift
函數可以給數組開頭添加一個 1 即可。
時間複雜度:O(n),空間複雜度:O(1)。
function plusOne($digits) {
$len = count($digits);
//因爲是給最後一位加一,所以從後向前判斷
for ($i = $len - 1; $i >= 0; $i--) {
//給當前位置加1
$digits[$i]++;
/**
* 該位置加1後和10取餘,
* 如果結果是 0,說明需要進一位,繼續循環,反之則加1結束,直接返回
*/
$digits[$i] %= 10;
if ($digits[$i] % 10 != 0) {
return $digits;
}
}
//到這一步,說明是99、999這樣的情況,這時digit已經變成 00、000,只需要給數組開頭加個1即可。
array_unshift($digits, 1);
return $digits;
}