1,问题描述
670. 最大交换
难度:中等
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
1 2 3
| 输入: 2736 输出: 7236 解释: 交换数字2和数字7。
|
示例 2 :
1 2 3
| 输入: 9973 输出: 9973 解释: 不需要交换。
|
注意:
- 给定数字的范围是 [0, 108]
2,初步思考
我自己首先想到的是单调栈来解决这个问题,这个有点像最大有效扣号数目的题目
其他人的题解中有一个很厉害的观点,就是直接去模拟
3,代码处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| import support.Pair;
import java.util.ArrayDeque; import java.util.Deque;
public class _670最大交换 {
public int maximumSwap_gov(int num) { char[] array = String.valueOf(num).toCharArray(); int maxIndex = array.length - 1, swapIndex = -1, minIndex = -1, len = array.length; for (int i = len - 1; i >= 0; i--) { if (array[i] > array[maxIndex]) { maxIndex = i; } else if (array[i] < array[maxIndex]) { swapIndex = maxIndex; minIndex = i; } } if (minIndex == -1) { return num; } char tmp = array[swapIndex]; array[swapIndex] = array[minIndex]; array[minIndex] = tmp; return Integer.parseInt(String.valueOf(array)); }
public void swap(char[] charArray, int i, int j) { char temp = charArray[i]; charArray[i] = charArray[j]; charArray[j] = temp; }
public int maximumSwap_fail(int num) { char[] charArray = String.valueOf(num).toCharArray(); int left = 0, right = charArray.length - 1; while (left < charArray.length - 1) { if (charArray[left] < charArray[left + 1]) { break; } left++; } if (left == charArray.length) return num;
int idx = right; int max = charArray[idx]; while (right > left) { if (charArray[right] > max) { max = charArray[idx]; idx = right; } right--; }
char temp = charArray[left]; charArray[left] = charArray[idx]; charArray[idx] = temp; return Integer.parseInt(new String(charArray)); }
public int maximumSwap(int num) { char[] charArray = String.valueOf(num).toCharArray(); Deque<Pair<Character, Integer>> maxStack = new ArrayDeque<>(); for (int i = charArray.length - 1; i >= 0; i--) { if (maxStack.isEmpty() || maxStack.peek().getKey() < charArray[i]) { maxStack.push(new Pair<>(charArray[i], i)); } }
for (int i = 0; i < charArray.length && !maxStack.isEmpty(); i++) { if (charArray[i] == maxStack.peek().getKey() && maxStack.peek().getValue() <= i) { maxStack.pop(); continue; } if (charArray[i] < maxStack.peek().getKey()) { Pair<Character, Integer> peek = maxStack.peek(); char temp = charArray[i]; charArray[i] = peek.getKey(); charArray[peek.getValue()] = temp; break; } } return Integer.parseInt(new String(charArray)); }
public static void main(String[] args) { _670最大交换 maximumSwap = new _670最大交换(); System.out.println(maximumSwap.maximumSwap_optimize(999879)); System.out.println(maximumSwap.maximumSwap_optimize(9973)); System.out.println(maximumSwap.maximumSwap_optimize(1993)); System.out.println(maximumSwap.maximumSwap_optimize(98368)); } }
|