하나 추가

#66.플러스원

문제 설명



정수 배열 digits으로 표시되는 큰 정수가 제공됩니다. 여기서 각 digits[i]은 정수의 ith 자리입니다. 숫자는 왼쪽에서 오른쪽 순서로 가장 중요한 것부터 가장 중요하지 않은 것까지 정렬됩니다. 큰 정수에는 선행 0이 포함되어 있지 않습니다.

큰 정수를 1씩 증가시키고 결과 숫자 배열을 반환합니다.

예 1

Input: digits = [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.
Incrementing by one gives 123 + 1 = 124.
Thus, the result should be [1,2,4].


예 2

Input: digits = [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.
Incrementing by one gives 4321 + 1 = 4322.
Thus, the result should be [4,3,2,2].


예 3

Input: digits = [9]
Output: [1,0]
Explanation: The array represents the integer 9.
Incrementing by one gives 9 + 1 = 10.
Thus, the result should be [1,0].


설명



給定一個整數並以陣列形式表示, 其整數依照常理數字規則開頭不為 0,返回該整數加一後的陣列結果

해결책



題目 題目 理解 理解 理解 理解 考量 考量 簡單 是 進位 進位 進位 進位 進位 也 很 很 簡單 簡單 簡單 簡單 簡單 簡單 簡單 簡單 一般 數學 的 加法 加法 加法 加法 加法 先 先 把 陣列 陣列 陣列 中 中 的 整數 整數 轉換 成 字串 字串 將 將 字串 合併 轉換 成 成 整數 整數 整數 整數 使用 運算 運算 運算 運算 讓 整數 直接 加 加 加 加 加 字串 將 將 將 將 將 將 將 將 將 將 將 將 將 將 將 字串 字串 字串 字串 字串 字串 合併 合併 合併 인得到結果,最後將字串的結果轉換成整數陣列返回

public int[] PlusOne(int[] digits)
{
    string str = "";

    for (int i = 0; i < digits.Length; i++)
        str += digits[i];

    int tmp = int.Parse(str) + 1;

    str = tmp.ToString();

    int[] res = new int[str.Length];

    for (int i = 0; i < str.Length; i++)
        res[i] = int.Parse(str[i].ToString());

    return res;
}


測試沒問題提交到 LeetCode 上,結果噴出一個錯誤 System.OverflowException: Value was either too large or small for a UInt64 ,看起來是在字串轉換成數值時大小不夠,即便換成 long 型態也會不夠,考量到這一點,我想應該要換個做法

這次 我不用數值相加的運算子來做,我想要直接對陣列進行迭代,並在迭代過程中進行單一位數值的相加,的以避免上述錯誤

首先建立一個 List<int> 集合用以儲存結果,以及一個 bool 表示是否有進位,透過迴圈走訪陣列,起始值從陣列的最後一個索引開始,因為要從個位數加一,之後在往前判斷是否要 要 要 要 要 進位 if 是 用來 判斷 判斷 是否 為 為 個位數 個位數 個位數 個位數 個位數 個位數 個位數 個位數 執行 執行 相加 相加, else 則 是 個位 個位 數 以外 以外 的 位數, else 內 第一 個 個 個 if else 用來 判斷 有 沒有 需要 進位 進位 進位 進位 進位 進位 進位 進位 需要 需要 需要 需要 沒有 沒有 沒有 沒有 有인지 有 判斷 判斷 判斷就不加以解釋,純粹只是將結果添加到 List<int> 集合中以及紀錄需不需要進位

迴圈 迴圈 後 後 結束 需要 在 判斷 一 一 次 次 有 有 沒有 進位 進位 進位 進位 進位 進位 進位 進位 進位 進位 進位 進位 進位 進位 有 有 就 直接 添加 1, 舉例 99+1 = 100, 如果 沒有 這個 判斷 判斷 判斷, list 裡 的 結果 只 只 只 只 只 有 有 有 而 不 100

最後將 list 轉換成陣列,透過原生陣列的反轉方法將其反轉就是答案了

public int[] PlusOne(int[] digits)
{
    if (digits.Length == 0) return null;

    List<int> list = new List<int>();
    bool carry = false;

    for (int i = digits.Length - 1; i >= 0; i--)
    {
        if (i == digits.Length - 1)
        {
            if (digits[i] + 1 == 10)
            {
                list.Add(0);
                carry = true;
            }
            else
                list.Add(digits[i] + 1);
        }
        else
        {
            if (carry)
            {
                if (digits[i] + 1 == 10)
                {
                    list.Add(0);
                    carry = true;
                }
                else
                {
                    list.Add(digits[i] + 1);
                    carry = false;
                }
            }
            else
                list.Add(digits[i]);

        }
    }

    if (carry)
        list.Add(1);

    var res = list.ToArray();

    Array.Reverse(res);

    return res;
}


我 我 寫 在 篇 文章 的 的 時候 覺得 覺得 這樣 這樣 的 寫法 不 不 太 好 好 好 好 好 好 好 好 好 將 將 將 迴圈 內 的 第一 第一 個 if 判斷 拿到 迴圈 迴圈 外面 執行 才 才 不 每 每 次 次 進到 迴圈 都 需要 判斷 判斷 判斷 的話 的話 的話 的話 的話 的話 不 不 不 才 才 才 不 不 不 不 不 會 會 會 會 每 每 每 每 每 次 次 次 次 進到 進到 進到 迴圈 迴圈 都 需要 需要 判斷 外面 外面 外面 外面 外面迴圈的起始值要改成倒數第二個索引開始,其餘的部分沒有什麼差異

public int[] PlusOne(int[] digits)
{
    List<int> list = new List<int>();
    bool carry = false;

    int len = digits.Length - 1;

    if (digits[len] + 1 == 10)
    {
        list.Add(0);
        carry = true;
    }
    else list.Add(digits[len] + 1);

    for (int i = len - 1; i >= 0; i--)
    {
        if (carry)
        {
            if (digits[i] + 1 == 10)
                list.Add(0);
            else
            {
                list.Add(digits[i] + 1);
                carry = false;
            }
        }
        else list.Add(digits[i]);
    }

    if (carry) list.Add(1);

    var res = list.ToArray();
    Array.Reverse(res);

    return res;
}


참조



LeetCode Solution

GitHub Repository


글 읽어주셔서 감사합니다 🌷 🌻 🌼

마음에 드셨다면 주저말고 하트 꾸욱 눌러주세요❤️
또는 내 Leetcode 솔루션에서 좋아요를 클릭하세요.
또는 내 GitHub 팔로우 ⭐
또는 커피를 사주세요 ⬇️ 감사합니다.

좋은 웹페이지 즐겨찾기