给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

    示例 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(""));
    };