मान लीजिए कि हमारे पास एक सकारात्मक 32-बिट पूर्णांक n है, हमें सबसे छोटा 32-बिट पूर्णांक खोजने की आवश्यकता है, जिसमें पूर्णांक n में मौजूद समान अंक हैं और n से अधिक है। अगर हमारे पास ऐसी कोई सकारात्मक 32-बिट पूर्णांक संख्या नहीं है, तो -1 लौटाएं।
तो अगर संख्या 213 है, तो परिणाम 231 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- s :=n स्ट्रिंग के रूप में, sz :=s का आकार, ठीक :=false
- मैं के लिए रेंज sz – 2 से 0
- . में
- अगर s[i]
- अगर s[i]
- अगर का गलत है, तो वापस करें - 1
- सबसे छोटा :=i, curr :=i + 1
- j के लिए i + 1 से sz – 1 की श्रेणी में
- आईडी s[j]> s[सबसे छोटा] और s[j] <=s[curr], फिर curr :=j
- एक्सचेंज एस[सबसे छोटा] एस के साथ[कर्र]
- ऑक्स:=इंडेक्स 0 से सबसे छोटे में s का सबस्ट्रिंग
- रिवर्स ऑक्स
- ret :=इंडेक्स 0 से सबसे छोटे + aux में s का सबस्ट्रिंग
- रिटर्न -1 अगर रिट है> 32-बिट +ve इंटीजर रेंज, अन्यथा रेट करें
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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