力扣670(java)-最大交换(中等)

题目:

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。


注意: 给定数字的范围是 [0, 108]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-swap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

1.首先将数字转换成字符数组便于遍历每一个数字;

2.数字从后往前遍历,用一个数组记录每一个数字对应的最大索引;

3.再从头遍历原数组,当原数组的值与当前位置对应的最大索引值的原数组的值不相等时(有点绕口,看下面的例子就清楚了),就进行交换,交换完成就退出循环,将字符数组转换成整数输出即为结果。

例1:

数字98367

1.先确定最大索引值数组maxArr=[0,1,4,4,4]

从后往前遍历:
遍历7:最大值是7,7的索引值为4
遍历6:最大值是7,7的索引值为4
遍历3:最大值是7,7的索引值为4
遍历8:最大值是8,8的索引值为1
遍历9:最大值是9,9的索引值为0

2.进行原数组遍历,当原数组与当前最大值索引对应的值不相等时进行交换,结果为98763

nums[0] = 9, nums[maxArr[0]] = 9,相等不交换跳过;
nums[1] = 8, nums[maxArr[1]] = 8,相等不交换跳过;
nums[2] = 3, nums[maxArr[2]] = 7,不相等,进行交换为98763;

例2:

数字97257

1.先确定最大索引值数组maxArr=[0,4,4,4,4]

从后往前遍历:
遍历7:最大值是7,7的索引值为4
遍历5:最大值是7,7的索引值为4
遍历2:最大值是7,7的索引值为4
遍历7:最大值是7,7的索引值为4
遍历9:最大值是9,9的索引值为0

2.进行原数组遍历,当原数组与当前最大值索引对应的值不相等时进行交换,结果为98763

nums[0] = 9, nums[maxArr[0]] = 9,相等不交换跳过;
nums[1] = 7, nums[maxArr[1]] = 7,相等不交换跳过;
nums[2] = 2, nums[maxArr[2]] = 7,不相等,进行交换为97752;

代码:

 1 class Solution {
 2     public int maximumSwap(int num) {
 3         //将数字转换成字符数组
 4         char[] nums = Integer.toString(num).toCharArray();
 5         int[] maxArr = new int[nums.length];
 6         int maxIdx = nums.length - 1;
 7         //确定最大索引值数组
 8         for(int i = nums.length - 1; i >= 0; i--){
 9             if(nums[i] > nums[maxIdx]){
10                 maxIdx = i;
11             }
12             maxArr[i] = maxIdx;
13         }
14     
15         for(int i = 0; i < nums.length; i++){
16             if(nums[maxArr[i]] != nums[i]){
17                 char temp = nums[i];
18                 nums[i] = nums[maxArr[i]];
19                 nums[maxArr[i]] = temp;
20                 break;
21             }
22         }
23         return Integer.parseInt(new String(nums));
24 
25     }
26 }

posted on 2022-08-08 22:22  我不想一直当菜鸟  阅读(66)  评论(0编辑  收藏  举报