Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 차세대 요소 III

<시간/>

양의 32비트 정수 n이 있다고 가정하고 정수 n에 존재하는 정확히 동일한 자릿수를 갖고 값이 n보다 큰 가장 작은 32비트 정수를 찾아야 합니다. 그러한 양의 32비트 정수가 없으면 -1을 반환합니다.

따라서 숫자가 213이면 결과는 231이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • s :=n을 문자열로, sz :=s의 크기, ok :=false
  • sz – 2에서 0 사이의 i에 대해
    • s[i]
  • of가 거짓이면 1을 반환합니다.
  • 가장 작은 :=i, curr :=i + 1
  • i + 1 ~ sz – 1 범위의 j에 대해
    • id s[j]> s[가장 작은] 및 s[j] <=s[curr], 다음 curr :=j
  • s[smallest]를 s[curr]로 교환
  • aux :=인덱스 0에서 가장 작은 s의 부분 문자열
  • 역보조
  • 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