力扣每日一题-最大交换-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)

结语

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值