给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
给定数字的范围是 [0, 108]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-swap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这题先将Int 映射成l:List[Int],然后比对l 和 sorted l。
- 为了不使得第一步映射函数调用两次,我用一个help函数。如果写成solve(trans(x), trans(x).sortBy(x => -x),那么会出现重复运算。
- 在solve过程中,会出现交换和不交换两种情况。 所以,用一个新的函数来完成交换操作。
- Done。完美解决。
- 如果用array来做,似乎可以更简单些,但是Array是object,用来做参数,内存开销太大。如果不做参数,会产生副作用。
object Solution {
def maximumSwap(num: Int): Int = {
def trans(n:Int):List[Int] = n.toString.toArray.map{ch => ch - '0'}.toList
def solve(l:List[Int], sl:List[Int], acc:List[Int] = Nil):List[Int] = (l, sl) match {
case (h1::t1, h2::t2) if h1 == h2 => solve(t1,t2, h1::acc)
case (Nil, Nil) => acc.reverse
case (x::t1, y::t2) => doSwap(x, y, t1.reverse,Nil, acc)
}
def doSwap(x:Int, y:Int, rl:List[Int],racc:List[Int], acc:List[Int]):List[Int] = rl match {
case `y`::t => acc.reverse ++ (y::t.reverse) ++ (x::racc)
case h::t => doSwap(x,y,t, h::racc, acc)
case Nil => List.empty[Int]
}
def help(l:List[Int]):Int = solve(l, l.sortBy(x => -x)).mkString.toInt
help(trans(num))
}
}