最大交换

103 阅读1分钟

670. 最大交换 - 力扣(LeetCode)

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

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [0, 10^8]

解题

/**
 * @param {number} num
 * @return {number}
 */
var maximumSwap = function (num) {
  let ns = [];
  while (num > 0) {
    ns.push(num % 10);
    num = (num / 10) | 0;
  }
  let arr = ns.map((v, i) => [v, i]).sort((a, b) => a[0] - b[0]);
  let i = arr.length - 1;
  while (i >= 0) {
    if (arr[i][0] !== ns[i]) {
      let j = i;
      while (i && arr[i - 1][0] === arr[i][0]) {
        i = i - 1;
      }
      let n = ns[j];
      ns[j] = arr[i][0];
      ns[arr[i][1]] = n;
      break;
    }
    i--;
  }

  return +ns.reverse().join("");
};