【題目】
給定一個由 整數 組成的 非空 數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: digits = [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
示例 2:
輸入: digits = [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。
示例 3:
輸入: digits = [0]
輸出: [1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
【題目解析】
解決算法: 數組操作
方法描述: 從數組的最后一位開始,逐位加一并處理進位。如果最高位產生進位,需要在數組最前面插入新的一位。
-
具體步驟:
- 從數組最后一位開始,即個位數開始處理加一操作。
- 如果該位加一后小于10,則直接返回結果,因為不會影響到更高位的數字。
- 如果該位加一后等于10(產生進位),則該位變為0,并向前一位繼續處理加一操作。
- 如果循環結束都沒有返回結果,說明最高位也產生了進位,此時在數組最前面插入一位1。
算法特點:
- 直觀簡單:直接在輸入的數組上操作,易于理解和實現。
- 高效:最多遍歷一次數組,時間復雜度為O(n)。
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
for i in range(n-1, -1, -1):
if digits[i] < 9:
digits[i] += 1
return digits
digits[i] = 0
# 處理全是9的情況,例如[9,9,9]變成[1,0,0,0]
return [1] + digits
執行效率
image.png
【總結】
適用問題類型:
這類方法適用于涉及數字逐位操作和進位處理的問題,尤其當處理的數字大小超出了語言的標準整型范圍或者需要直接在數字的序列表示上進行操作時。這不僅限于簡單的加法運算,還包括但不限于大數運算、二進制運算、以及任何需要精細控制數字每一位操作的場景。此外,這種方法也適合處理那些涉及序列和數字直接相互轉換的問題,例如將數字轉換為數組形式以便進行某些特定的操作,或者在一些算法實現中模擬硬件級別的運算處理。
解決算法: 數組逐位加法與進位處理
算法特點:
- 直接操作與靈活性: 算法直接在數組表示的數字上操作,無需將數字轉換為其他形式或使用高級數據結構,提供了操作的靈活性。
- 適應性強: 可以很容易地適應各種大小的數字,特別是對于大數運算,這種方法避免了數字溢出的問題。
- 簡潔性與高效性: 算法結構簡單,一次遍歷即可完成操作,使得算法既簡潔又高效。
時間復雜度與空間復雜度:
- 時間復雜度: O(n),其中n是數組的長度。在最壞的情況下,即數組中所有的數字都是9且需要進位時,算法需要遍歷整個數組。
- 空間復雜度: O(1)。算法在原數組上操作,除了最終可能需要在數組前面增加一位以處理全部是9的數組外,不需要額外的存儲空間。即使在最壞的情況下,額外空間的需求也是常數級別的。
實踐意義:
- 大數處理能力: 在實際應用中,尤其是在金融、科學計算和加密算法等領域,經常會遇到需要處理超出標準數據類型范圍的大數。這種方法能夠提供一種簡單而有效的解決方案。
- 深入理解數字表示和運算: 通過直接操作數字的數組表示,可以幫助開發者更深入地理解數字在計算機中的存儲和運算方式,這對于深入學習計算機科學的基礎知識非常有益。
- 算法教育和面試準備: 這類問題常見于算法面試和編程競賽中,掌握這種方法不僅可以幫助解決實際問題,也是對算法能力的一種展示。
- 基礎算法能力培養: 實現和理解這種算法可以作為進一步學習更復雜算法和數據結構的基礎,比如學習如何處理鏈表中的數位操作等。