LeetCode Scala 9. Palindrome Number 回文数

本文介绍了两种解决LeetCode 9. Palindrome Number问题的方法,分别是通过字符串反转和数字直接反转。在Scala中,字符串反转法直接调用`reverse`方法,但可能不适用于所有情况,如负数和以0结尾的数。数字反转法采用递推法,需确保数值完全归零后退出循环,避免在特定测试用例中出错。递归法虽然对思维训练有益,但需要注意尾递归优化和特值处理。

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


字符串反转解法

这个思路很简单,就是把所有的数字都转成字符串,然后调一个reverse方法反转,再比较两者的值是否相等,这个在 Scala 里是比较好做的,Scala 默认情况下的 == 方法是从 any 继承来的,本身是 final 的,而且本身是基于值比较的,这个就不贴代码了,没什么好做的,只是有几个坑需要注意一下:

  1. 所有的负数都不是回文数
  2. 0 是回文数
  3. 结尾是 0 的数不是回文数(不过这个好像不坑这个解法)
object Solution {
  def isPalindrome(x: Int): Boolean = {
    if (x<0) false
    else {
      val y = x.toString.reverse
      val xS = x.toString
      y == xS
    }
  }
}

最终的结果不是很好看,但是跑了很多遍都是这个样子了,也没办法,可见在这个转换过程中还是要消耗比较多资源的,所以这种方法并不是很好
在这里插入图片描述


数字直接反转解法

递推法

整体思路比较简单,就是除 10 模 10 就完了,没什么好说的
有一个坑是注意while那里的条件,一定是那个数真的归零了才能退出循环,不能简单地用除或模,只有两个都为零才行,否则会在 1001 这个测试这里卡住

object Solution {
  def isPalindrome(x: Int): Boolean = {  
    var xs:Int = x
    var res:Int = 0
    if(x<0) false
    else {
        while(xs%10!=0||xs/10!=0){
            res = xs%10 + res*10
            xs /= 10
        }
    res += xs%10
    res==x
    }
  }
}

在这里插入图片描述

递归法

这个需要注意的是,在递归过程当中,是否优化成尾递归,这里加入了一个尾递归标记,会使用多余的类型推断时间,这个可以被优化,但主要问题是 JVM 的启动时间问题
这里需要注意在之前说的三个坑,这个可以直接按照特值来解决掉,反正才三个,没必要增加代码的复杂度。
写递归是比较头疼的一种做法,需要从尾部开始拆分问题,将一个大问题拆分成重复的小问题来解决,对于思维的训练是十分有益的。

object Solution {
    def isPalindrome(x: Int): Boolean = {
        @annotation.tailrec
        def conv(x:Int, y:Int):Int = { 
            if(x/10==0) x%10 + y                           
            else conv(x/10, (y+x%10)*10)
        }
        if(x<0) false
        else if(x==0) true
        else if(x%10==0) false
        else conv(x, 0)==x
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值