给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
**
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
给定数字的范围是 [0, 10]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-swap
思路:
使用 last
数组保存个位数最后出现的位置,对num
进行扫描时,可贪心的得知,对于第i位数,如果在第i位以后有num[i]~9中的较大值,交换即可得最大值。即:如果 last[d] > i
时,交换num[last[d]]
和num[i]
的值
例如:
2736 ->last = [-1,-1,0,2,-1,-1,3,1,-1,-1,]
对于num[0] i = 0
last[9] > 0? no ->不交换
last[8] > 0? no->不交换
last[7] > 0? yes 2和7交换->得到答案 7236
复杂度分析:
var maximumSwap = function (num) {
num = (num + "").split("");
let n = num.length;
let last = new Array(10).fill(-1);
for (let i = 0; i < num.length; i++) {
last[num[i].charCodeAt(0) - "0".charCodeAt(0)] = i;
}
for (let i = 0; i < num.length; i++) {
for (let d = 9; d > num[i].charCodeAt(0) - '0'.charCodeAt(0); d--) {
if (last[d] > i) {
[num[i], num[last[d]]] = [num[last[d]], num[i]];
return +(num.join(""));
}
}
}
return +(num.join(""));
};