मान लीजिए कि हमारे पास एक सकारात्मक 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