9. 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例:
输入: 121
输出: true输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
分析:
法1:如果将整数转换为字符串来解决这个问题,会非常简单,只需要对转换后的字符串进行一次遍历就可以了。而且只需要遍历一半的元素。
法2:如果根据进阶的要求。我们可以对数字进行一半的翻转。我们求取数字的后一半的翻转。具体做法是,不断地对原数字x进行取余,得到的结果保存在变量reversed中。当在reversed < x时,继续循环,reversed * 10作为高一位,同时继续对x取余,加上余数作为低位。同时对x / 10。
例如:对121进行上述操作,
-
reversed = 1
x = 12
-
reversed = 1 * 10 + 2
x = 1
接着如何通过翻转后的数字来判断回文呢?对于偶数原数字,判断reversed == x即可。对于奇数数字,reversed最后会比x高一位,只需要reversed / 10 == x即可。因为中间的一位数字只有一个,不会影响回文序列。
注意事项:
有一些数我们是可以直接判断不能构成回文序列的。
- 负数,由于存在负号。
- 个位为0,且不为0的数。高位无法存在0。
代码(Golang):
// 法1
func isPalindrome1(x int) bool {
str := strconv.Itoa(x)
n := len(str)
for i := 0; i < n / 2 + 1; i++ {
if str[i] != str[n - 1 - i] {
return false
}
}
return true
}
// 法2
func isPalindrome2(x int) bool {
if x < 0 || x % 10 == 0 && x != 0 {
return false
}
reversed := 0
for reversed < x {
reversed = reversed * 10 + x % 10
x /= 10
}
return reversed == x || reversed / 10 == x
}
小结:
字符串解法非常简单,翻转数字的写法很有趣。