C++で最大1つのスワップ操作を使用して次に大きい数
数値nが与えられた場合、結果の数値が数値nより大きくなるように、数値の任意の2桁を交換します。それが不可能な場合は、-1を出力します。例を見てみましょう。
入力
12345
出力
12354
4桁目と5桁目を入れ替えました。1回の入れ替えでより高い数字が得られました。
アルゴリズム
-
数字の桁が降順の場合、数字を形成することはできません。
-
最後の桁よりも小さい数字の右側から桁のインデックスを見つけます。
-
前の桁より大きく、すべての桁より小さい桁のインデックスを見つけます。
-
2桁を入れ替えて、新しい番号を返します。
- 新しい番号を返します。
実装
以下は、C++での上記のアルゴリズムの実装です
#include <bits/stdc++.h> using namespace std; string getNextHigherNumber(string num) { int len = num.size(); int firstDigitIndex = -1; for (int i = len - 2; i >= 0; i--) { if (num[i] < num[len - 1]) { firstDigitIndex = i; break; } } if (firstDigitIndex == -1) { return "-1"; } int secondDigitIndex = -1; for (int i = len - 1; i > firstDigitIndex; i--) { if (num[i] > num[firstDigitIndex]) { if (secondDigitIndex == -1 || num[i] <= num[secondDigitIndex]) { secondDigitIndex = i; } } } char temp = num[firstDigitIndex]; num[firstDigitIndex] = num[secondDigitIndex]; num[secondDigitIndex] = temp; return num; } int main() { string num = "12345"; cout << "Given number: " << num << endl; cout << "Next higher number: " << getNextHigherNumber(num) << endl; return 0; }
出力
上記のコードを実行すると、次の結果が得られます。
Given number: 12345 Next higher number: 12354
-
C++を使用して軸の片側に残りのポイントを取得するために削除するポイントの最小数。
問題の説明 デカルト平面でN点が与えられます。私たちのタスクは、任意の軸の片側に残りのポイントを取得するために削除する必要があるポイントの最小数を見つけることです。 与えられた入力が{(10、5)、(-2、-5)、(13、8)、(-14、7)}の場合、(-2、-5)を削除すると、残りのすべてのポイントはXより上になります。 -軸。 したがって、答えは1です。 アルゴリズム 1. Finds the number of points on all sides of the X-axis and Y-axis 2. Return minimum from both of them 例 #in
-
C++で整数の1の補数を見つける
このセクションでは、整数の1の完全なものを見つける方法を説明します。補数演算子を使用してこのタスクを非常に高速に実行できますが、32ビットの補数値(4バイト整数)になります。ここでは、nビット数の補数が必要です。 22という数値があるとします。2進数に相当するものは10110です。補完された値は01001で、これは9と同じです。ここで問題が発生します。この値を見つける方法は?最初に、与えられた数のビット数を見つける必要があります。カウントがcであると仮定します(ここでは、22の場合はc =5)。 51を作成する必要があります。したがって、これは11111になります。これを行うには、1を左にc