难度: 中等
题目大意 :
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值
提示
- 给定数字的范围是 [0, 10^8]
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
因为题目给定了要交换的数字的个数,而且数的最大的位数就是8位,所以可以直接暴力枚举即可
代码实现
class Solution {
public:
int maximumSwap(int num) {
string s = to_string(num);
int res = num, n = s.size();
for (int i = 0; i < n; i ++) {
for (int j = i + 1; j < n; j ++) {
swap(s[i], s[j]);
res = max(res, stoi(s));
swap(s[i], s[j]);
}
}
return res;
}
};
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2) (n
是数字的位数n <= 8
)
int stoi(string s)
,将一个string
类型的转化为int
类型的,类似的库函数还有stol
,stoll
等等考虑如果没有限制次数,那么最大的数字就是数位从大到小排序,所以我们只需要将原来的数字和最大的数字进行对比,如果不一样,那么把这个数字交换过来就行,这样一定能保证是最大的
class Solution {
public:
int maximumSwap(int num) {
string s = to_string (num), t = s;
sort(t.rbegin(), t.rend());
for (int i = 0; i < s.size(); i ++) {
if (s[i] != t[i]) {
swap(s[i], *find(s.rbegin(), s.rend(), t[i]));
break;
}
}
return stoi(s);
}
};
时间复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) (n
是数字的位数 n <= 8
)
结束了