力扣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 }