iT邦幫忙

2024 iThome 鐵人賽

1
佛心分享-刷題不只是刷題

刷經典 LeetCode 題目系列 第 54

經典LeetCode 66. Plus One

  • 分享至 

  • xImage
  •  

這題我們要將給定的數字陣列視作一個整數,並對其進行加一操作,最終返回加一後的結果作為陣列形式。

題目:
給定一個非負整數陣列 digits,每個元素代表該整數的一個位數。假設數字是以非負整數的形式存儲在陣列中,且數字的最高位存放在陣列的開頭,陣列中的每個元素僅包含一個數字 0-9。我們需要對整數加 1,並返回加一後的新陣列表示。

範例:

輸入: digits = [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123,加 1 後變為 124。

輸入: digits = [4,3,2,1]
輸出: [4,3,2,2]

輸入: digits = [9,9,9]
輸出: [1,0,0,0]
解釋: 輸入陣列表示數字 999,加 1 後進位變為 1000。

解題思路

處理進位問題,並從低位開始處理,

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        vector<int> res;
        int carry = 1;
        for (int i = digits.size()-1; i >= 0; i--) {
            int sum = digits[i] + carry;
            res.push_back(sum % 10);
            if (sum > 9)
                carry = 1;
            else
                carry = 0;
        }
        if (carry == 1) res.push_back(carry);
        reverse(res.begin(), res.end());
        return res;
    }
};

思考有更好的解法?是否不用另一個變數跟反轉呢?
假如 +1 後不用進位的話馬上就可以回傳結果了,
如果是連續都是9的話就會一直迴圈進位,如果執行到迴圈結束的話,表示還能再進位,就在頭部插入1,

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for (int i = digits.size()-1; i >= 0; i--) {
            if (digits[i] < 9) {
                digits[i]++;
                return digits;
            } else {
                digits[i] = 0; // 進位
            }
        }
        digits.insert(digits.begin(), 1); // 進位
        return digits;
    }
};

考慮到連續進位的話基本上全都為0,只有最高位為1,那麼原本這樣寫

digits.insert(digits.begin(), 1);

也可以改成這樣寫,

digits[0] = 1;
digits.push_back(0);

參考:
#66. Plus One


上一篇
經典LeetCode 977. Squares of a Sorted Array
下一篇
經典LeetCode 202. Happy Number
系列文
刷經典 LeetCode 題目66
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言