判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最初的代码:
class Solution {
public boolean isPalindrome(int x) {
int newX = reverse(x);
if(x == newX)
return true;
return false;
}
//将该整数传入逆置函数,逆置该数
public int reverse(int y){
int num = 0;
int sum = 0;
for (int i = y;i >= 0;i = i/10) {
num = i%10;
sum = sum * 10 + num;
}
return sum;
}
}
以上代码结果:超出时间限制
经检查,问题一:由于for循环中的判断条件出现差错,导致死循环
问题二:并且没有判断如果输入的值为负数时该如何处理
改正后的代码如下:
方法一
class Solution {
public static boolean isPalindrome(int x) {
if (x < 0) return false;
int newX = reverse(x);
return x == newX;
}
//将该整数传入逆置函数,逆置该数
public static int reverse(int y){
int num = 0;
int sum = 0;
for (int i = y;i != 0;i = i/10) {
num = i%10;
sum = sum * 10 + num;
}
return sum;
}
}
class Solution {
public boolean isPalindrome(int x) {
if(x < 0) return false;
int num = 0;
int res = 0;
for (int i = x;i != 0;i = i / 10) {
num = i % 10;
res = res * 10 + num;
}
return res == x;
}
}
第二个代码看上去比第一个简洁许多,但是在执行效率和内存消耗上第一个代码更胜一筹。
为什么呢??
上述代码会出现内存溢出的情况,所以采用下述,只反转一半的方法
方法二
class Solution {
public boolean isPalindrome(int x) {
// 10 和 小于 0 的都是 false【特殊情况】
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
// 将数字只反转一半
// 当前一部分的个数 ≤ 后一部分的个数时,跳出循环
// 说明已经遍历到位了
int reverseNum = 0;
while (x > reverseNum) {
reverseNum = reverseNum * 10 + x % 10;
x /= 10;
}
// 数字的个数存在奇数和偶数的情况,所以要分成两个条件来写
if (x == reverseNum || x == (reverseNum / 10))
return true;
return false;
}
}