力扣每日一题-最大交换-2024.01.22

发布时间:2024年01月22日

?力扣每日一题-最大交换

开篇

?好久没有更新力扣的每日一题了,今天刚好先做了这道题,就发一下吧。

题目链接 670.最大交换

题目描述

在这里插入图片描述

解题思路

? 这道题用了贪心的思想,在交换的时候,要选择交换后最大的值。
? 首先,要创建两个数组,一个正常记录值为arr1,一个利用sort排序排好为arr2。然后从高位开始对比,比较出第一个不相同的数字,这个数字的位置就是需要变换的第一个位i,
? 而第二个要变换位置的地方,其数值为第一个不相同的数字中arr2的值。根据最大化的要求,我们要尽量从低位寻找这个值,所以从arr1低位开始寻找,找到后进行交换即可。

代码

![class Solution {
    public int maximumSwap(int num) {
        int len = 0;
        int temp = num;
        while(temp > 0){ //统计长度
            len++;
            temp /= 10;
        }
        if(len == 1) return num; //一位数不用变
        int[] arr1 = new int[len]; //创建两个对比数组
        int[] arr2 = new int[len];
        temp = num;
        for(int i = 0; i < len; i++){ //同时给两个数组赋值
            arr1[i] = temp % 10;
            arr2[i] = temp % 10;
            temp /= 10;
        }
        Arrays.sort(arr2); //排序好的是理论上交换无数次后的最大值
        for(int i = len - 1; i >= 0; i--){
            if(arr1[i] != arr2[i]){ //从高位寻找第一个需要交换的位置
                for(int k = 0; k <= i - 1; k++){ //从低位寻找第二个需要交换的位置
                    if(arr1[k] == arr2[i]){  //进行交换
                        int change = arr1[k];
                        arr1[k] = arr1[i];
                        arr1[i] = change;
                        break;
                    }
                }
                break;
            }
        }
        int num1 = 0;
        for(int i = len - 1; i >= 0; i--){ //将数组转换成int类型
            num1 = num1 * 10 + arr1[i];
        }
        return num1;
    }
}](https://img-blog.csdnimg.cn/direct/93160549a832478187cc20939cf2d100.png)

结语

? 如果这道题的分享对您有所帮助,点个赞或关注,我会经常分享算法题的讲解,与大伙儿一同进步。

文章来源:https://blog.csdn.net/m0_73709096/article/details/135740375
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。