【多次过】Lintcode 1095. 最大的交换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/86519184

给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。

样例

样例1:

输入: 2736
输出: 7236
解释: 交换数字2和数字7.

样例2:

输入: 9973
输出: 9973
解释: 不用交换.

注意事项

  1. 给定的数字在 [0, 10^8] 内。

解题思路:

大神则想出了O(n)时间复杂度的方法:
使用 buckets 来记录数字 0 ~ 9 的最后出现位置。

从左到右遍历num的数字,对于每个位置,我们查找是否在之后的位置中存在一个比它更大的数(从 9 一直找到当前位置的数字大小)。我们也需要确保 这个更大的数字的位置 是 位于当前位置 之后的。如果找到了,我们就可以交换这两个数字的位置,返回结果。

public class Solution {
    /**
     * @param num: a non-negative intege
     * @return: the maximum valued number
     */
    public int maximumSwap(int num) {
        // Write your code here
        char[] digits = String.valueOf(num).toCharArray();
        int[] buckets = new int[10];//使用 buckets 来记录数字 0 ~ 9 的最后出现位置。
        
        for(int i=0; i<digits.length; i++)
            buckets[digits[i] - '0'] = i;
        
        for(int i=0; i<digits.length; i++){         //从最高位开始
            for(int j=9; j>digits[i] - '0'; j--){   // j需要比数字digits[i]大
                if(buckets[j] > i){                 //如果j的位置在i后面
                    swap(digits, i, buckets[j]);
                    
                    return Integer.valueOf(new String(digits));
                }
            }
        }
        
        return num;
    }
    
    private void swap(char[] digits, int i, int j){
        char temp = digits[i];
        digits[i] = digits[j];
        digits[j] = temp;
    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/86519184