LeetCode [66/67/69] プラス 1、バイナリ合計、x の平方根 C/C++ - 5 日目

66. プラスワン

タイトル 説明 [単純]:
空でない整数配列で表される負でない整数が与えられた場合、その数値に 1 を加えます。

最上位の桁は配列の先頭に格納され、配列内の各要素には 1 つの数値のみが格納されます。

この整数は、整数 0 以外のゼロで始まることはないと想定できます。

翻訳:
配列の各ビットは 1 桁であるため、0 ~ 9 の 1 桁のみにすることができ、整数には先頭のゼロがありません。つまり、配列の最初の数値は 0 であってはなりません。その後、支払いを行います。 [9,9 ] のように注意してください。出力は [1,0,0] です。

例 1:
入力: 数字 = [1,9,9,]
出力: [2,0,0]
説明: 入力配列は数値 199 を表します。

アイデア[暴力]:

数字の配列を後ろから前にたどって、9 に遭遇すると 0 になり、9 に遭遇しない場合は +1 になります。すべてキャリーの場合は、新しい配列を構築します。for 以降はすべて 0 です。このとき、最初の桁、つまり digit[0]=1 とします。

C++ コード:

class Solution {
    
    
public:
    vector<int> plusOne(vector<int>& digits) {
    
    
        for(int i = digits.size() - 1 ; i >= 0 ; i--){
    
    
            if(digits[i] == 9){
    
    
                digits[i] = 0 ;
            }
            else {
    
    
                digits[i] += 1;
                return digits ;
            }
        }
           //如果所有位都是进位,则长度+1
        vector<int> digit(digits.size() + 1);//构造一个新的数组
        digit[0] = 1;//在第一个for的基础上全是0,现在让他的最高位即digit[0]=1即可。
        return digit;
    }
};

結果:
の結果

67. 二進和

タイトル 説明 [単純]:
2 つのバイナリ文字列を指定して、その合計を (バイナリ表現で) 返します。

入力は、数値 1 と 0 のみを含む空ではない文字列です。

例 1:
入力: a = "11"、b = "1"
出力: "100"

アイデア:

バイナリ キャリー コアは完全なバイナリ キャリー 1 です。

1. 2 つの文字列の長さを等しくします。長さが等しくない場合は、短い文字列の前にゼロを埋めます。
2. すべての数字を後ろから前にたどって、同じビットを追加します。(文字の加算にはASCIIコードを使用できます。文字は内部的に数字で表されます。具体的な値を知る必要はありませんが、0 - 0 = 0、0 +1 = 1であることはわかっています) 文字の加算と減算は次のとおりです。実際には内部数値の加算と減算です。
3. 追加された文字を判断し、2以上の場合は次の桁を1ずつ入力する必要があります。

0 番目の数字の追加は、文字の挿入 (つまり、先頭に数字 1 を追加する必要があるかどうか) を伴う可能性があるため、ここでは個別に処理されます。

C++ コード:

class Solution {
    
    
public:
    string addBinary(string a, string b) {
    
    
         int al = a.size();
        int bl = b.size();
        while(al < bl) //让两个字符串等长,若不等长,在短的字符串前补零
        {
    
    
            a = '0' + a;
            ++ al;
        }
        while(al > bl)
        {
    
    
            b = '0' + b;
            ++ bl;
        }
        for(int j = a.size() - 1; j > 0; -- j) //从后到前遍历所有的位数,同位相加
        {
    
    
            a[j] = a[j] - '0' + b[j];
            if(a[j] >=  '2') //若大于等于字符‘2’,需要进1
            {
    
    
                a[j] = (a[j] - '0') % 2 + '0';
                a[j-1] = a[j-1] + 1;
            }
        }
        a[0] = a[0] - '0' + b[0]; //将a、b的第0位相加
        if(a[0] >= '2') //若大于等于2,需要进1
        {
    
    
            a[0] = (a[0] - '0') % 2 + '0';
            a = '1' + a;
        }
        return a;

    }
};

この問題のアルゴリズムは実はあまり良くないのですが、反転の仕方がよく分からないので、これが一番分かりやすいです。そこで、よく理解できるコードを書きました。

69.x の平方根

タイトル 説明 [単純]:
負でない整数 x を指定して、x の算術平方根を計算して返します。
戻り値の型は整数であるため、結果の整数部分のみが保持され、小数部分は破棄されます。

例 1:
入力: x = 8
出力: 2
説明: 8 の算術平方根は 2.82842…です。戻り値の型が整数であるため、小数部分は四捨五入されます。

アイデア [二分探索]:

x の平方根の整数部分 res は、k^2 ≤ x を満たす最大の k 値であるため、k に対して二分探索を実行して答えを得ることができます。

二分探索の下限は 0 で、上限はおおよそ x に設定できます。二分探索の各ステップでは、中央要素の 2 乗と x のサイズの関係を比較し、比較の結果に応じて上限と下限の範囲を調整するだけで済みます。

C++ コード

class Solution {
    
    
public:
    int mySqrt(int x) {
    
    
        int left = 0, right = x, res = -1;
        while (left <= right) {
    
    
            int mid = left + (right - left) / 2;
            if ((long long)mid * mid <= x) {
    
    
                res = mid;
                left = mid + 1;
            } else {
    
    
                right = mid - 1;
            }
        }
        return res;
    }
};

結果分析:
アルゴリズムの分析

時間計算量: O(\log x)O(logx)。二分探索に必要な回数です。

おすすめ

転載: blog.csdn.net/Lailalalala/article/details/126064801