package LeetCode_670
/**
* 670. Maximum Swap
* https://leetcode.com/problems/maximum-swap/description/
*
* 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.
* */
class Solution {
fun maximumSwap(num: Int): Int {
val numString = num.toString()
var leftIndex = -1
var rightIndex = -1
var maxNum = -1
var maxIndex = -1
for (i in numString.length - 1 downTo 0) {
if (maxNum < numString[i].toInt()) {
maxNum = numString[i].toInt()
maxIndex = i
}
if (maxNum > numString[i].toInt()) {
leftIndex = i
rightIndex = maxIndex
}
}
if (leftIndex == -1) {//for example: 9973
return num
}
val chars = numString.toCharArray()
swap(chars, leftIndex, rightIndex)
return arrayToNum(chars)
}
private fun arrayToNum(array: CharArray): Int {
var result = 0
for (item in array) {
if (item.equals("")) {
continue
}
result *= 10
result += (item.toInt() - '0'.toInt())
}
return result
}
private fun swap(str: CharArray, start: Int, end: Int) {
val temp = str[end]
str[end] = str[start]
str[start] = temp
}
}