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.

 [暴力解法]:

时间分析:

空间分析:

 [优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

数字强制转char会失败,必须用digits[buckets[k]] 值-index-值的三层转换

[思维问题]:

取最大、第二大再合并,莫名其妙写起来很麻烦。涉及到交换位置、索引有关的,用桶排序

[一句话思路]:

存索引,然后从9开始往小试

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 字符串转数组,目标是数组,所以需要-'0'

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

  1. 字符串转数组,目标是数组,所以需要-'0'

[复杂度]:

时间复杂度为O(N+K),空间复杂度也为O(N+K)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

前面的类型是什么就能转成什么

Integer.valueOf(String.valueOf(digits));

[算法思想:递归/分治/贪心]:

[关键模板化代码]:

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

 [代码风格] :

class Solution {
    public int maximumSwap(int num) {
        //cc
        
        
        //ini: digits, buckets
        char[] digits = String.valueOf(num).toCharArray();
        int[] bucket = new int[10];
        
        for (int i = 0; i < digits.length; i++) bucket[digits[i] - '0'] = i;
        //for loop: exchange
        for (int i = 0; i < digits.length; i++) {
            for (int j = 9; j > digits[i] - '0'; j--) {
                //if bigger index
                if (bucket[j] > i) {
                    char temp = digits[i];
                    digits[i] = digits[bucket[j]];
                    digits[bucket[j]] = temp;
                    return Integer.valueOf(String.valueOf(digits)); 
                }
            }
        }
        
        return num;
    }
}
View Code
原文地址:https://www.cnblogs.com/immiao0319/p/9038577.html