• 图解LeetCode——670. 最大交换(难度:中等)


    一、题目

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

    二、示例

    2.1> 示例 1 :

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

    2.2> 示例 2 :

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

    注意:

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

    三、解题思路

    3.1> 思路1:排序 + 对比交换

    根据题意描述,我们要交换两个数,使其交换后得到最大值。那么从高位开始,找到第一个没按照降序排列的数,就是我们需要替换的数了。所以,我们可以通过Arrays.sort(...)方法,将原有数组进行排序(默认是升序排序,当与原数组对比的时候,我们可以采用对排序后的数组执行倒序遍历即可)。

    如下图所示:将原数组与排序数组进行对比,发现第3个位置是不对的,应该是8,但是原数组却是3,所以我们将原数组的3替换为8

     那么,下一步,就是需要将原数组的8替换为3了。此时,为了保证交互后得到最大值,所以我们需要采用逆序遍历的方式,从数组的尾部开始找8,当找到后,将8替换为3即可。

    3.2> 思路2:倒序遍历最大下标 + 对比交换

    在思路2中,我们首先创建一个数组maxIndexs,它是用来存放数组下标index用的。那存放什么index呢?就是说,我们逆序遍历数组numArr,将当前遍历过的数组元素中,最大值的下标index存入到相应的maxIndexs中。如下图所示:

    • 遍历numArr[8],当前最大值就是它本身(下标index=8),所以maxIndexs[8]被赋值8;
    • 遍历numArr[7],当前最大值就是它本身(下标index=7),所以maxIndexs[7]被赋值7;
    • 遍历numArr[6],当前最大值就是它本身(下标index=6),所以maxIndexs[6]被赋值6;
    •  ... ...

    从上图中我们可以发现一个规律,就是在已经降序排序好的数组中,maxIndexs中存储的也就是numArr中该元素自身的下标,也就是说,每个元素在判断最大值的时候,都是与它右侧的所有元素进行对比的。那么,根据这个规律,我们再来尝试解答本题。

    如下图所示,numArr逆序遍历后,maxIndexs=[0,4,4,4,4,5],那么我们从头开始对比 numArr[i] 和 numArr[maxIndexs[i]] 的值,如果发现不同了,那么互换的下标就是 i 和 maxIndexs[i] 。

    四、代码实现

    4.1> 代码1:排序 + 对比

    1. class Solution {
    2.     public int maximumSwap(int num) {
    3.         char[] num1 = String.valueOf(num).toCharArray();
    4.         char[] num2 = String.valueOf(num).toCharArray();
    5.         Arrays.sort(num2);
    6.         Character lc = null, hc = null;
    7.         for (int i = 0; i < num1.length; i++) {
    8.             if (num1[i] != num2[num1.length - i - 1]) {
    9.                 lc = num1[i];
    10.                 hc = num2[num1.length - i - 1];
    11.                 num1[i] = num2[num1.length - i - 1];
    12.                 break;
    13.             }
    14.         }
    15.         if (lc != null) {
    16.             for (int i = num1.length - 1; i >= 0; i--) {
    17.                 if (hc.equals(num1[i])) {
    18.                     num1[i] = lc;
    19.                     break;
    20.                 }
    21.             }
    22.         }
    23.         return Integer.valueOf(new String(num1));
    24.     }
    25. }

    4.2> 代码2:倒序遍历最大下标 + 对比

    1. class Solution {
    2.     public int maximumSwap(int num) {
    3.         char[] numArr = String.valueOf(num).toCharArray();        
    4.         int[] maxIndexs = new int[numArr.length];
    5.         int index = numArr.length - 1;
    6.         for (int i = numArr.length - 1; i >= 0; i--) {
    7.             if (numArr[i] > numArr[index]) index = i;
    8.             maxIndexs[i] = index;
    9.         }
    10.         for (int i = 0; i < numArr.length; i++) {
    11.             if (numArr[i] != numArr[maxIndexs[i]]) {
    12.                 char temp = numArr[i];
    13.                 numArr[i] = numArr[maxIndexs[i]];
    14.                 numArr[maxIndexs[i]] = temp;
    15.                 break;
    16.             }
    17.         }
    18.         return Integer.valueOf(new String(numArr));
    19.     }
    20. }

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

  • 相关阅读:
    python+requests接口自动化测试
    敏稳融合时代,云原生PaaS是企业IT转型的“灵药”吗?
    Hive SQL 高级函数使用
    QT基础第三天(3)widget,dialog和mainwindow
    视频学习|Springboot在线学习系统
    MongoDB副本集搭建
    React <> </>的用法
    GraphQL渗透测试详解
    C#的LINQ select查询、where过滤、group分组、join关联
    使用proxy把后端返回的图片域名替换成目标域名
  • 原文地址:https://blog.csdn.net/qq_26470817/article/details/126826947