[LeetCode/Scala] 670.最大交换

本文介绍了一个算法问题,即如何通过至多一次数字位的交换,将一个非负整数转换为可能的最大值。通过示例说明了算法的原理,如将2736转换为7236,以及特殊情况如9973无需交换。文章详细解释了使用Scala实现的解决方案,包括数字转换为列表,比较原始列表与排序后的列表,以及交换操作的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

示例 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。

  1. 为了不使得第一步映射函数调用两次,我用一个help函数。如果写成solve(trans(x), trans(x).sortBy(x => -x),那么会出现重复运算。
  2. 在solve过程中,会出现交换和不交换两种情况。 所以,用一个新的函数来完成交换操作。
  3. Done。完美解决。
  4. 如果用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))
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值