मान लीजिए हमारे पास एक धनात्मक 32-बिट पूर्णांक n है, हमें सबसे छोटा 32-बिट पूर्णांक ढूंढना है जिसमें पूर्णांक n में मौजूद वही अंक हों और जो n से मान में बड़ा हो। यदि ऐसा कोई धनात्मक 32-बिट पूर्णांक नहीं है, तो -1 लौटाएं।
इसलिए यदि संख्या 213 है, तो परिणाम 231 होगा।
हल का दृष्टिकोण
इसे हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:
s := n को स्ट्रिंग के रूप में, sz := s का आकार, ok := falsei = sz-2 से 0तक:- यदि
s[i] < s[i+1], तोok := trueऔर लूप तोड़ें
- यदि
- यदि
okfalse है, तो -1 लौटाएं smallest := i, curr := i+1j = i+1 से sz-1तक:- यदि
s[j] > s[smallest] और s[j] <= s[curr], तोcurr := j
- यदि
s[smallest]कोs[curr]के साथ बदलेंaux := s का उपस्ट्रिंग इंडेक्स 0 से smallest तकauxको उल्टा करेंret := s का उपस्ट्रिंग इंडेक्स 0 से smallest+1 तक + aux- यदि
ret > 32-बिट धनात्मक पूर्णांक सीमातो -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);
}
};
int main(){
Solution ob;
cout << (ob.nextGreaterElement(213));
}
इनपुट
213
आउटपुट
231