66. 加一:
給定一個由 整數(shù) 組成的 非空 數(shù)組所表示的非負整數(shù),在該數(shù)的基礎(chǔ)上加一。
最高位數(shù)字存放在數(shù)組的首位, 數(shù)組中每個元素只存儲單個數(shù)字。
你可以假設(shè)除了整數(shù) 0 之外,這個整數(shù)不會以零開頭。文章來源:http://www.zghlxwxcb.cn/news/detail-622195.html
樣例 1:
輸入:
digits = [1,2,3]
輸出:
[1,2,4]
解釋:
輸入數(shù)組表示數(shù)字 123。
樣例 2:
輸入:
digits = [4,3,2,1]
輸出:
[4,3,2,2]
解釋:
輸入數(shù)組表示數(shù)字 4321。
樣例 3:
輸入:
digits = [0]
輸出:
[1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
分析:
- 面對這道算法題目,二當(dāng)家的再次陷入了沉思。
- 最開始閃過一個念頭,直接拿數(shù)組的末位,加上一不就完事了?
- 雖然是個簡單題,但也不能太不當(dāng)回事了。
- 如果最后一位不是9,那的確就完事了,但如果是9的話,就要產(chǎn)生進位,而不是簡單的加一了。
- 進位之后,前一位就要加一,又有可能產(chǎn)生進位,所以這道題主要就是處理進位。
- 最終有可能所有的數(shù)字都是9,從末尾一路進位到頭,空間不夠了,這種情況下就只能申請新的空間了,要多一位出來。
- 分析參數(shù)有三種可能性:
- 末尾沒有 9,例如 [1,2,3],那么我們直接將末尾的數(shù)加一,得到 [1,2,4] 并返回。
- 末尾有若干個 9,例如 [1,2,3,9,9],那么我們只需要逆向找出第一個不為 9 的元素,即 3,將該元素加一,同時途中的 9 都變?yōu)?,得到 [1,2,4,0,0] 并返回。
- 所有元素都是 9,例如 [9,9,9,9,9],那么答案為 [1,0,0,0,0,0]。我們只需要構(gòu)造一個長度比參數(shù)長度多 1 的新數(shù)組,將首元素置為 1,其余元素置為 0 即可。
- 所以這道題可以這樣處理,從數(shù)組末位逆向查找第一個不是 9 的數(shù)字,加一,途中是 9 的位都變成0,進位。
- 如果所有的數(shù)字都是 9,那么直接申請新的空間,比源數(shù)組長度加一,然后首位賦值為1即可。
題解:
rust:
impl Solution {
pub fn plus_one(mut digits: Vec<i32>) -> Vec<i32> {
let n = digits.len();
for i in (0..n).rev() {
if digits[i] == 9 {
// 進位變?yōu)?
digits[i] = 0;
} else {
// 第一個不是9的位
digits[i] += 1;
return digits;
}
}
// digits 中所有的元素均為 9
let mut ans = vec![0; n + 1];
ans[0] = 1;
return ans;
}
}
go:
func plusOne(digits []int) []int {
n := len(digits)
for i := n - 1; i >= 0; i-- {
if digits[i] == 9 {
// 進位變?yōu)?
digits[i] = 0
} else {
// 第一個不是9的位
digits[i]++
return digits
}
}
// digits 中所有的元素均為 9
digits = make([]int, n+1)
digits[0] = 1
return digits
}
c++:
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
const int n = digits.size();
for (int i = n - 1; i >= 0; --i) {
if (digits[i] == 9) {
// 進位變?yōu)?
digits[i] = 0;
} else {
// 第一個不是9的位
++digits[i];
return digits;
}
}
// digits 中所有的元素均為 9
vector<int> ans(n + 1);
ans[0] = 1;
return ans;
}
};
python:
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:
# 進位變?yōu)?
digits[i] = 0
else:
# 第一個不是9的位
digits[i] += 1
return digits
# digits 中所有的元素均為 9
return [1] + [0] * n
java:
class Solution {
public int[] plusOne(int[] digits) {
final int n = digits.length;
for (int i = n - 1; i >= 0; --i) {
if (digits[i] == 9) {
// 進位變?yōu)?
digits[i] = 0;
} else {
// 第一個不是9的位
++digits[i];
return digits;
}
}
// digits 中所有的元素均為 9
int[] ans = new int[n + 1];
ans[0] = 1;
return ans;
}
}
非常感謝你閱讀本文~
歡迎【點贊】【收藏】【評論】三連走一波~
放棄不難,但堅持一定很酷~
希望我們大家都能每天進步一點點~
本文由 二當(dāng)家的白帽子:https://le-yi.blog.csdn.net/ 博客原創(chuàng)~文章來源地址http://www.zghlxwxcb.cn/news/detail-622195.html
到了這里,關(guān)于算法leetcode|66. 加一(rust重拳出擊)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!