C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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]
  • 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

  1. 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の場合

  2. C++の以前のより大きな要素

    この問題では、配列が与えられます。私たちのタスクは、配列内の現在の要素の前にある最大の要素を返すことです。それ以外の場合は-1を出力します。 問題を理解するために例を見てみましょう Input: {6, 2, 7, 1, 5, 3} Output: -1, 6, -1, 7, 7, 7 この問題を解決するための簡単で明白な解決策は、配列の前の部分のより大きな要素をチェックするネストされたループを使用することです。 ソリューションの実装を示すプログラム 例 #include <iostream> using namespace std; void preceddingGreat