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