アルゴリズム leetcode|66. 1 つ追加 (サビが激しくパンチします)



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. [1,2,3] のように末尾に9がない場合は、末尾の数字に直接 1 を加えて [1,2,4] を取得して返します。
    2. [1,2,3,9,9] のように、末尾に9 がいくつかある場合は、逆に9ではない最初の要素、つまり 3 を見つけて、この要素に 1 を追加するだけで済みます。同時に、途中の9がすべて0になり、[1,2,4,0,0]を取得して戻ります。
    3. すべての要素が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/ブログオリジナル〜


おすすめ

転載: blog.csdn.net/leyi520/article/details/132017913