假设我们有一个正的32位整数n,我们需要找到最小的32位整数,该整数与整数n中存在的数字完全相同,并且值大于n。如果我们没有这样的正32位整数,则返回-1。
因此,如果数字为213,则结果将为231。
为了解决这个问题,我们将遵循以下步骤-
s:= n作为字符串,sz:= s的大小,确定:= false
当我在sz范围内– 2到0
如果s [i] <s [i + 1],则ok:= true并中断循环
如果of为假,则返回– 1
最小:= i,curr:= i + 1
对于范围i + 1至sz – 1中的j
id s [j]> s [smallest]和s [j] <= s [curr],然后curr:= j
与s [curr]交换s [smallest]
aux:= s的子串,从索引0到最小
反向辅助
ret:= s的子串,从索引0到最小+ aux
如果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