题目

题目来源:力扣(LeetCode)

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

示例 1 :

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

示例 2 :

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

思路分析

  1. 核⼼就⼀句话:就是把第⼀个⼩数和它后⾯最⼤的⼤数进⾏交换
  2. 要让⼀个数变⼤,要尽可能的让其⾼位变⼤ ,让最⾼位的⼩数和后⾯的⼤数交换
  1. /**
  2. * @param {number} num
  3. * @return {number}
  4. */
  5. var maximumSwap = function (num) {
  6. // 记录每个数字出现的最后一次出现的下标
  7. let last = new Array(10).fill(-1);
  8. num = Array.from(num.toString());
  9. //找到相同值最后出现的位置
  10. for (let i = 0; i < num.length; i++) {
  11. last[num[i] - '0'] = i;
  12. }
  13. //原数组从左到右遍历,索引数组从后往前遍历
  14. //遇到比当前位值大的,交换,因为索引数组从后往前遍历的,所以保证了值为最大
  15. for (let i = 0; i < num.length; i++) {
  16. // 找最大,所以倒着找
  17. for (let d = 9; d > (num[i] - '0'); d--) {
  18. if (last[d] > i) {
  19. let temp = num[last[d]];
  20. num[last[d]] = num[i];
  21. num[i] = temp;
  22. // 只允许交换一次,因此直接返回
  23. return Number(num.join(""));
  24. }
  25. }
  26. }
  27. return Number(num.join(""));
  28. };

参考阅读:https://leetcode-cn.com/problems/maximum-swap/solution/2021316-zui-da-jiao-huan-quan-chang-zui-ery0x/