给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。
样例
样例1:
输入: 2736
输出: 7236
解释: 交换数字2和数字7.
样例2:
输入: 9973
输出: 9973
解释: 不用交换.
注意事项
- 给定的数字在 [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;
}
}