题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例
1:输入: 121
输出: true
2:输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
3:输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:你能不将整数转为字符串来解决这个问题吗?
解决方案
解法一:普通解法最好理解的一种解法就是先将 整数转为字符串 ,然后将字符串分割为数组,只需要循环数组的一半长度进行判断对应元素是否相等即可。
func isPalindrome(x int) bool {
// 转成字符串反转后判断是否相等
xStr := strconv.Itoa(x)
str := []byte(xStr)
for l, r := 0, len(str)-1; r > l; l, r = l+1, r-1 {
str[l], str[r] = str[r], str[l]
}
return string(str) == xStr
}
解法二:进阶解法—数学解法通过取整和取余操作获取整数中对应的数字进行比较。举个例子:1221 这个数字。通过计算 1221 / 1000, 得首位1通过计算 1221 % 10, 可得末位 1进行比较再将 22 取出来继续比较
func isPalindrome(x int) bool {
if x == 0 {
return true
}
if x < 0 || x%10 == 0 {
return false
}
if x != reverse(x) {
return false
}
return true
}
func reverse(x int) int {
var tmp int
var sum int
for x != 0 {
tmp = x % 10
sum = sum*10 + tmp
x = x / 10
}
return sum
}