题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
解法 1:将数字转换为字符串反转字符串
通过反转字符串来比较新旧字符串是最简单的方式。
JavaScript 解法
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function (x) {
return String(x) === String(x).split("").reverse().join("");
};
Golang 解法
由于 Golang 没有 reverse 函数,所以稍微麻烦些。
func isPalindrome(x int) bool {
s := strconv.Itoa(x)
runes := []rune(s)
for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
runes[from], runes[to] = runes[to], runes[from]
}
return s == string(runes)
}
解法 2:反转数字
首先来分析两种不是回文字的情况。
- 负数不是回文数。
- 当数字最后一位为 0 时,只有自身为 0 才是回文数。
其次在反转时,只需要反转一半即可,利用反转后的一半和前一半进行对比,如果相同就是回文字。
进行中间比较,就需要找到中心线。
这时会有两种情况,奇数和偶数。
奇数的中心线是中间那个数,偶数的中心线是中间两个数之间的那条线。
如果反转数为 revertedNumber,那么奇数终止循环的条件是 x < revertedNumber,偶数终止循环的条件是 x = revertedNumber。组合起来,终止循环的条件是 x <= revertedNumber。那么循环的条件就是 x > revertedNumber。
获取到反转一半的结果后,需要进行比较,此时还是要分别处理奇数和偶数。
偶数的比较是 revertedNumber == x。
奇数的比较是 revertedNumber / 10 == x。因为 revertedNumber 会比 x 多一个中间
JavaScript 解法
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function (x) {
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
var revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + (x % 10);
x = x / 10;
}
return x === revertedNumber || x === revertedNumber / 10;
};
Golang 解法
在第一次做这种题时可能会将整个数字全部反转,再去比较两个数字是否相等。这样做更容易理解一些,但和上面的做法相比会多几次循环,性能上稍差一些。
func isPalindrome(x int) bool {
if x < 0 || (x%10 == 0 && x != 0) {
return false
}
var revertedNumber int
oldVal := x
for x != 0 {
revertedNumber = revertedNumber*10 + x%10
x = x / 10
}
return revertedNumber == oldVal
}
时间复杂度:O(log10(n))
空间复杂度:O(1)