leetcode 670. Maximum Swap(最大交换)

Given a non-negative integer, you could swap two digits at most once to get the maximum valued number. Return the maximum valued number you could get.

Example 1:
Input: 2736
Output: 7236
Explanation: Swap the number 2 and the number 7.
Example 2:
Input: 9973
Output: 9973
Explanation: No swap.

给出一个数字,可以交换一位,使数字变成尽可能大

思路:
数字变大的途径是把最高位换成最大的数字,如果最高位已经是最大了就要把后面高位换成最大的数字。而且要尽量把最低位的最大数换到前面。

那么就从低位往高位遍历(数字的个位开始,从右至左),更新遇到的最大值,保存最大值所在的index,同时还需要一个指针往前走,遇到比这个最大值小的数字就保存index,找到尽量靠近最高位的比最大值小的数字。然后交换

数字没办法直接遍历每一位,可考虑转换成string或者char array
因为后面要交换数字,string不能做内容的变化,考虑用StringBuilder
但是StringBuilder的运行时间要大于char array,可能是因为stringBuilder.toString()方法需要重新建string再进行copy,开销较大吧,而且中间有string的拼接也是需要重建一个string的

StringBuilder方法

//5ms
    public int maximumSwap(int num) {
        if(num < 10) {
            return num;
        }
        
        StringBuilder sNum = new StringBuilder(Integer.toString(num));
        int p1 = -1;
        int p2 = -1;
        int n = sNum.length();
        
        int maxIdx = n - 1;
        
        for(int i = n-2; i >= 0; i--) {
            if(sNum.charAt(i) > sNum.charAt(maxIdx)) {
                maxIdx = i;
            } else if(sNum.charAt(i) < sNum.charAt(maxIdx)){
                p1 = i;
                p2 = maxIdx;
            }
        }
        
        if(p1 >= 0) {
            char tmp = sNum.charAt(p1);
            sNum.replace(p1, p1+1, ""+sNum.charAt(p2));
            sNum.replace(p2, p2+1, ""+tmp);
        }
        
        return Integer.parseInt(sNum.toString());
    }

char array方法

//0ms
    public int maximumSwap(int num) {
        if(num < 10) {
            return num;
        }
        
        char[] cNum = Integer.toString(num).toCharArray();
        
        int p1 = -1;
        int p2 = -1;
        int n = cNum.length;
        int maxIdx = n - 1;
        
        for(int i = n-2; i >= 0; i--) {
            if(cNum[i] > cNum[maxIdx]) {
                maxIdx = i;
            } else if(cNum[i] < cNum[maxIdx]) {
                p1 = i;
                p2 = maxIdx;
            }
        }
        
        if(p1 >= 0) {
            char tmp = cNum[p1];
            cNum[p1] = cNum[p2];
            cNum[p2] = tmp;
        }
        
        return Integer.parseInt(new String(cNum));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值