C++ 中的下一个更大元素 III
假设我们有一个正的 32 位整数 n,我们需要找到一个最小的 32 位整数,该整数恰好包含整数 n 中存在的相同数字,并且其值大于 n。如果没有这样的正 32 位整数,则返回 -1。
所以如果数字是 213,那么结果将是 231。
为了解决这个问题,我们将遵循以下步骤:
- s := n 作为字符串,sz := s 的大小,ok := false
- 对于 i 从 sz – 2 到 0 的范围
- 如果 s[i] < s[i + 1],则 ok := true 并中断循环
- 如果 ok 为 false,则返回 – 1
- smallest := i,curr := i + 1
- 对于 j 从 i + 1 到 sz – 1 的范围
- 如果 s[j] > s[smallest] 且 s[j] <= s[curr],则 curr := j
- 交换 s[smallest] 和 s[curr]
- aux := 从索引 0 到 smallest 的 s 的子字符串
- 反转 aux
- ret := 从索引 0 到 smallest + aux 的 s 的子字符串
- 如果 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);
}
};
main(){
Solution ob;
cout << (ob.nextGreaterElement(213));
}输入
213
输出
231
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP