하나 추가
16047 단어 algorithmsleetcodecsharpeasy
문제 설명
정수 배열
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 팔로우 ⭐
또는 커피를 사주세요 ⬇️ 감사합니다.
Reference
이 문제에 관하여(하나 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fakestandard/plus-one-25fm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)