博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最多交换两个数得到最大值并返回 Maximum Swap
阅读量:5783 次
发布时间:2019-06-18

本文共 2967 字,大约阅读时间需要 9 分钟。

hot3.png

问题:

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: 2736Output: 7236Explanation: Swap the number 2 and the number 7.

Example 2:

Input: 9973Output: 9973Explanation: No swap.

Note:

  1. The given number is in the range [0, 10^8]

解决:

① 暴力解决。

class Solution { //11ms

    public int maximumSwap(int num) {
        String str = String.valueOf(num);
        char[] schar = str.toCharArray();
        int res = num;
        int len = schar.length;
        for (int i = 0;i < len;i ++){
            for (int j = i + 1;j < len;j ++){
                swap(schar,i,j);
                res = Math.max(res,Integer.parseInt(String.valueOf(schar)));
                swap(schar,i,j);
            }
        }
        return res;
    }
    public void swap(char[] schar,int i,int j){
        char tmp = schar[i];
        schar[i] = schar[j];
        schar[j] = tmp;
    }
}

② 

我们希望置换后的数字最大,那么肯定希望将高位上的小数字和低位上的大数字进行置换,比如题目汇总的例子1。而如果高位上的都是大数字,像例子2那样,很有可能就不需要置换。

我们从高位向低位遍历,如果某一位上的数字小于其右边的最大数字,说明需要调换,由于最大数字可能不止出现一次,我们希望能跟较低位的数字置换,这样置换后的数字最大,所以我们就从低位向高位遍历来找那个最大的数字,找到后进行调换即可。

如对于1993这个数:

1 9 9 3

9 9 9 3  (dp数组,记录i之后的最大数)

9 1 3

建立好最大数组后,从头遍历原数字,发现1比9小,于是从末尾往前找9,找到后一置换,就得到了9913。

class Solution { //11ms

    public int maximumSwap(int num) {
        if (num <= 10) return num;
        char[] schar = Integer.toString(num).toCharArray();
        char[] dp = schar.clone();//记录i之后的最大值
        for (int i = schar.length - 2;i >= 0;i --){
            if (dp[i] < dp[i + 1]){
                dp[i] = dp[i + 1];
            }
        }
        for (int i = 0;i < schar.length;i ++){
            if (schar[i] == dp[i]) continue;
            for (int j = schar.length - 1;j > i;j --){
                if (schar[j] == dp[i]){
                    swap(schar,i,j);
                    return Integer.parseInt(String.valueOf(schar));
                }
            }
        }
        return Integer.parseInt(String.valueOf(schar));
    }
    public void swap(char[] schar,int i,int j){
        char tmp = schar[i];
        schar[i] = schar[j];
        schar[j] = tmp;
    }
}

③ 使用桶排序的思想,建了十个桶,分别代表数字0到9,每个桶存该数字出现的最后一个位置,也就是低位。这样我们从开头开始遍历数字上的每位上的数字,然后从大桶开始遍历,如果该大桶的数字对应的位置大于当前数字的位置,说明低位的数字要大于当前高位上的数字,那么直接交换这两个数字返回即可

class Solution { //11ms

    public int maximumSwap(int num) {
        char[] schar = String.valueOf(num).toCharArray();
        int[] bucket = new int[10];
        for (int i = 0;i < schar.length;i ++){
            bucket[schar[i] - '0'] = i;
        }
        for (int i = 0;i < schar.length;i ++){
            for (int k = 9;k > schar[i] - '0';k --){
                if (bucket[k] <= i) continue;
                swap(schar,i,bucket[k]);
                return Integer.parseInt(String.valueOf(schar));
            }
        }
        return num;
    }
    public void swap(char[] schar,int i,int j){
        char tmp = schar[i];
        schar[i] = schar[j];
        schar[j] = tmp;
    }
}

④ 与上面相同的思路,但是只需要一个变量保存比当前值大的位置。

class Solution { //12ms

    public int maximumSwap(int num) {
        char[] nums = String.valueOf(num).toCharArray();
        for(int i = 0; i < nums.length; i++) {
            int indexJ = -1;
            for(int j = nums.length - 1; j > i; j--) {
                if(nums[j] > nums[i]) {
                    if(indexJ == -1 || nums[j] > nums[indexJ]) indexJ = j;
                }
            }
            if(indexJ != -1) {
                swap(nums, i, indexJ);
                break;
            }
        }
        return Integer.parseInt(String.valueOf(nums));
    }
    public void swap(char[] nums, int i, int j) {
        char temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1606799

你可能感兴趣的文章
redhat tomcat
查看>>
统计数据库大小
查看>>
IO流的学习--文件夹下文件的复制
查看>>
第十六章:脚本化HTTP
查看>>
EXCEL表中如何让数值变成万元或亿元
查看>>
nginx在响应request header时候带下划线的需要开启的选项
查看>>
Linux下DHCP服务器配置
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
编写高性能的java程序
查看>>
Spring 的配置详解
查看>>
linux已经不存在惊群现象
查看>>
上位机和底层逻辑的解耦
查看>>
关于微信二次分享 配置标题 描述 图片??
查看>>
springcloud使用zookeeper作为config的配置中心
查看>>
校园火灾Focue-2---》洗手间的一套-》电梯
查看>>
bzoj1913
查看>>
L104
查看>>
分镜头脚本
查看>>
链表基本操作的实现(转)
查看>>
邮件发送1
查看>>