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)。二分探索に必要な回数です。