给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 108]
Related Topics
- 贪心
- 数学
著书三年倦写字,如今翻书不识志,若知倦书悔前程 ,无如渔樵未识时
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
凑合写了个费劲巴拉的方法
排序之后跟原序列对比,如果不同则交换位置
交换的新数字取最右边出现的位置
class Solution {
public int maximumSwap(int num) {
int size = stringSize(num);
if (size==1){
return num;
}
int[] arr = new int[size];
int[] map = new int[10];
Arrays.fill(map,-1);
int idx = size;
while ( num != 0){
arr[--idx] = num%10;
num /= 10;
if (map[arr[idx]]==-1){
map[arr[idx]]=idx;
}
}
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o2[0]-o1[0];
}
});
for (int i = arr.length-1; i >=0; i--) {
queue.offer(new int[]{arr[i],map[arr[i]]});
}
int i = -1;
int ans = 0;
while (!queue.isEmpty() && queue.peek()[0] == arr[++i]){
ans = ans * 10 + queue.poll()[0];
}
if (queue.isEmpty()){
return ans;
}
ans = ans * 10 + queue.peek()[0];
int[] swapIdx = new int[]{i,queue.peek()[1]};
while (++i < arr.length){
if (i == swapIdx[1]){
ans = ans * 10 + arr[swapIdx[0]];
}else{
ans = ans * 10 + arr[i];
}
}
return ans;
}
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
// Requires positive x
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}
}
发表评论