C++の次のGreaterElementIII
正の32ビット整数nがあるとすると、整数nに存在するのとまったく同じ桁を持ち、値がnより大きい最小の32ビット整数を見つける必要があります。そのような正の32ビット整数がない場合は、-1を返します。
したがって、数値が213の場合、結果は231になります。
これを解決するには、次の手順に従います-
- s:=n as string、sz:=size of s、ok:=false
- 範囲sz–2から0のiの場合
- s [i]
- s [i]
- ofがfalseの場合、–1を返します
- 最小:=i、curr:=i + 1
- i +1からsz–1の範囲のjの場合
- id s [j]>s[最小]およびs[j]<=s [curr]、次にcurr:=j
- s[最小]をs[curr]と交換します
- aux:=インデックス0から最小までのsの部分文字列
- リバースAux
- ret:=インデックス0から最小+auxまでのsの部分文字列
- retが>32ビット+ve整数範囲の場合は-1を返し、それ以外の場合はret
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: int nextGreaterElement(int n) { string s = to_string(n); int sz = s.size(); int i; bool ok = false; for(i = sz - 2; i >= 0; i--){ if(s[i] < s[i + 1]) { ok = true; break; } } if(!ok) return -1; int smallest = i; int curr = i + 1; for(int j = i + 1; j < sz; j++){ if(s[j] > s[smallest] && s[j] <= s[curr]){ curr = j; } } swap(s[smallest], s[curr]); string aux = s.substr(smallest + 1); reverse(aux.begin(), aux.end()); string ret = s.substr(0, smallest + 1) + aux; return stol(ret) > INT_MAX ? -1 : stol(ret); } }; main(){ Solution ob; cout << (ob.nextGreaterElement(213)); }
入力
213
出力
231
-
C++の次のGreaterElementII
循環配列があるとすると(最後の要素の次の要素は配列の最初の要素です)、すべての要素の次の大きい数値を表示する必要があります。ここで、数値xの次の大きい数は、配列内の次のトラバース順序の最初の大きい数です。これは、循環して次の大きい数を見つけることができることを意味します。存在しない場合は-1になります。したがって、数値が[1、2、1、3、2、1]の場合、出力は[2,3,3、-1,3,2]になります。 これを解決するには、次の手順に従います- n:=配列のサイズ サイズnのresと呼ばれる1つの配列を定義し、これを-1で埋めて、1つのスタックstを定義します 0〜2nの範囲のiの場合
-
C++の以前のより大きな要素
この問題では、配列が与えられます。私たちのタスクは、配列内の現在の要素の前にある最大の要素を返すことです。それ以外の場合は-1を出力します。 問題を理解するために例を見てみましょう Input: {6, 2, 7, 1, 5, 3} Output: -1, 6, -1, 7, 7, 7 この問題を解決するための簡単で明白な解決策は、配列の前の部分のより大きな要素をチェックするネストされたループを使用することです。 ソリューションの実装を示すプログラム 例 #include <iostream> using namespace std; void preceddingGreat