66. 1 つ追加します。
空でない整数の配列で表される負でない整数が与えられた場合、その数値に 1 を加えます。
最上位の桁は配列の先頭に格納され、配列内の各要素には1 つの数値のみが格納されます。
この整数は、整数 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
分析します:
- このアルゴリズムの問題に直面して、二代目リーダーは再び考え込んでしまいました。
- 最初に、配列の最後のビットを取り出して、最後に 1 を加えればいいのではないかという考えが浮かびました。
- 単純な質問ですが、あまり真剣に考えすぎないでください。
- 最後の桁が9でない場合は、実際に終了しますが、9の場合は、単純に 1 を加算するのではなくキャリーが生成されます。
- 桁上がり後は前の桁が1つ増え、再度桁上がりが発生する可能性があるため、主に桁上がりの対処についての質問です。
- 最終的にすべての数字が9になる可能性があります。端から先頭に移動すると、十分なスペースがありません。この場合は、新しいスペースを申請することしかできず、もう 1 つ用意する必要があります。 。
- パラメーターを分析するには 3 つの方法があります。
- [1,2,3] のように末尾に9がない場合は、末尾の数字に直接 1 を加えて [1,2,4] を取得して返します。
- [1,2,3,9,9] のように、末尾に9 がいくつかある場合は、逆に9ではない最初の要素、つまり 3 を見つけて、この要素に 1 を追加するだけで済みます。同時に、途中の9がすべて0になり、[1,2,4,0,0]を取得して戻ります。
- すべての要素が9 ([9,9,9,9,9] など) の場合、答えは [1,0,0,0,0,0] になります。パラメータの長さより 1 大きい長さの新しい配列を構築し、最初の要素を 1 に設定し、残りの要素を 0 に設定するだけです。
- そこでこの問題は、配列の最後の桁から最初の9ではない数字を逆に探して1を足し、途中で9になった桁が0になってキャリーするという方法で対処できます。
- すべての数値が9の場合は、新しいスペースを直接適用し、ソース配列の長さに 1 を追加して、最初の桁を 1 に割り当てます。
答え:
さび:
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 {
// 进位变为0
digits[i] = 0;
} else {
// 第一个不是9的位
digits[i] += 1;
return digits;
}
}
// digits 中所有的元素均为 9
let mut ans = vec![0; n + 1];
ans[0] = 1;
return ans;
}
}
行く:
func plusOne(digits []int) []int {
n := len(digits)
for i := n - 1; i >= 0; i-- {
if digits[i] == 9 {
// 进位变为0
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) {
// 进位变为0
digits[i] = 0;
} else {
// 第一个不是9的位
++digits[i];
return digits;
}
}
// digits 中所有的元素均为 9
vector<int> ans(n + 1);
ans[0] = 1;
return ans;
}
};
パイソン:
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:
# 进位变为0
digits[i] = 0
else:
# 第一个不是9的位
digits[i] += 1
return digits
# digits 中所有的元素均为 9
return [1] + [0] * n
ジャワ:
class Solution {
public int[] plusOne(int[] digits) {
final int n = digits.length;
for (int i = n - 1; i >= 0; --i) {
if (digits[i] == 9) {
// 进位变为0
digits[i] = 0;
} else {
// 第一个不是9的位
++digits[i];
return digits;
}
}
// digits 中所有的元素均为 9
int[] ans = new int[n + 1];
ans[0] = 1;
return ans;
}
}
この記事を読んでいただきありがとうございます~
【いいね】【お気に入り】【コメント】へようこそ~三回連続で歩きましょう~
諦めるのは難しいことではありませんが、やり抜くのはカッコいいですね~
みんなで改善できればと思います毎日少しずつ〜この記事は二代目マスターのホワイトハット
が書いています:https://le-yi.blog.csdn.net/ブログオリジナル〜