leetcode - Maximum Swap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode - 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.

===================

看到这个题目的第一个想法应该是:一旦遇到一个digit存在不属于他的位置(换句话说, 就是比他的的数字在他的后面), 那么我们就要swap。

这个想法就会引导我们想要记录digit和相对应的index,所以我们就有两个可以用的: hashmap 和 array  

这里我们选数组 int[] numberToIndex, numberToIndex的index代表digit,value对应digit存在的index, 所以size 应该就是10 代表0->9 所有可能的数字

345 -> numberToIndex[3] : 0;  numberToIndex[4] : 1, numberToIndex[5] : 2   

这题的关键点在于, 我们要把所有在numberToIndex中比当前digit大的数字所在index跟当前digit的index进行比较 (从最大的开始,9),一旦找到一个前者index大的,那么我们就swap,并且return,结束。 我们看到那些number中不存在的digit会被intialize为0,不会影响结果。 

============代码===============

 1     public int maximumSwap(int sum) {
 2         String str = sum + "";
 3         int[] numberToIndex = new int[10];
 4         int i = 0;
 5         for (char chara : str.toCharArray()) {
 6             numberToIndex[chara - ‘0‘] = i++;
 7         }    
 8         int j = 0;
 9         while (j < str.length()) {
10             int current = str.charAt(j) - ‘0‘;
11             for (int number = 9; number > current; number--) {
12                 int indexOfLarge = numberToIndex[number];
13                 if (j < indexOfLarge) {
14                     int newNum = swap(j, indexOfLarge, str, str.charAt(j));
15                     return newNum;
16                 }
17             }
18             j++;
19         }
20         return sum;
21     }

 

以上是关于leetcode - Maximum Swap的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 670: Maximum Swap

LeetCode 670: Maximum Swap

[LeetCode] Maximum Swap 最大置换

Leetcode-1156 Swap For Maximum Repeated Substring(单字符重复子串的最大长度)

670. Maximum Swap

670. Maximum Swap