其他分享
首页 > 其他分享> > 力扣解题思路:670. 最大交换/parseInt和valueOf的区别

力扣解题思路:670. 最大交换/parseInt和valueOf的区别

作者:互联网

670. 最大交换

思路:在这里插入图片描述

看到这题我第一反应就是想到下一个排列,不过很快发现这两题并没办法使用同一种思路,因为这一题是要求最大,且只能交换一次,相当于多了很多别的限制。

初步的思路是,直接将数组排序,然后和原来的数组从左往右不断对比,如果一样就下一位,如果不一样则往数组后面找到这个最大数,然后交换位置,交换完就直接break即可:

    public int maximumSwap(int num) {
        if(num<10) return num;
        char[] ary = (num+"").toCharArray();
        char[] copy = new char[ary.length];
        System.arraycopy(ary,0,copy,0,ary.length);
        Arrays.sort(copy);
        for(int i=0;i<ary.length;i++){
            char tmp = copy[ary.length-1-i];
            if(ary[i]!=tmp){
                int idx = i;
                for(int j=i+1;j<ary.length;j++){
                    if(ary[j]==tmp) idx = j;
                }
                ary[idx] = ary[i];
                ary[i] = tmp;
                break;
            }
        }
        return Integer.parseInt(new String(ary));
    }

但是这样嵌套了两层循环而且发生了排序,实在不够优雅,因为我们还需要可以去找这个大数对应的索引,那么我们不如这样,我们记录每个数的后面(包括本身)的最大数值的索引,最后从左往右遍历数组观察是否最大数和当前数一样,若不一样则交换后break,若一样就下一位,这样就可以不用排序啦:

    char[] chars = Integer.toString(num).toCharArray();
    int maxIdx = chars.length - 1;
    int[] maxArr = new int[chars.length];
    for (int i = chars.length - 1; i >= 0  ; i--) {
        if (chars[i] > chars[maxIdx]) {
            maxIdx = i;
        }
        maxArr[i] = maxIdx;
    }
    for (int i = 0; i < chars.length; i++) {
        if (chars[maxArr[i]] != chars[i]) {
            char temp = chars[maxArr[i]];
            chars[maxArr[i]] = chars[i];
            chars[i] = temp;
            break;
        }
    }
    return Integer.parseInt(new String(chars));

这里顺带补充一下其他知识,parseInt和valueOf的区别:
1、返回值不同
parseInt 返回值是int型
valueof 返回值是Integer型

    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }

2、valueof就是调用了parseInt方法的

    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }

3、parseInt效率比valueof效率高

标签:int,ary,chars,valueOf,670,力扣,length,parseInt,Integer
来源: https://blog.csdn.net/qq_39879315/article/details/113794115