9. 回文数
难度:简单
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
将整数x转换为字符串来做的话是十分简单的,
只需遍历字符串的一半 x.length()/2
再判断x[i]==x[x.length()-1-i] 设置一个Flag 是否一直为真就可以了。
如果不用字符串 就使用
①整数x除以10求余数,得到x个位的值,赋值给temp
②此时再让x自除以10.新的x中原来的十位变成了个位
③再让answer(初始为0)乘10加上temp
循环①-③当x=0时表示x已经被除尽了(设置为循环条件)
class Solution {
public boolean isPalindrome(int x) {
if(x<0) return false; //根据题意 x<0时据不符合条件
int y = x;
int ans = 0;
int temp = 0;
while( x!=0 ){
temp = x % 10;
x /= 10;
ans = ans*10+temp;
}
return (ans == y) ? true : false;
}
}
这个解法和No.7整数翻转很像
但是
这个解法显然可以被优化
因为当x翻转到一半时就可以判断此时的x是否等于answer。
比如1001。翻转到一半时ans = 10 x = 10;显然可以判断
又比如12321 :
参数\次数 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
temp | 1 | 2 | 3 | 2 | 1 |
x | 1232 | 123 | 12 | 1 | 0 |
ans | 1 | 12 | 123 | 1232 | 12321 |
第二次循环就可以判断if(answer==x/10)123 和 12
这样考虑的话,循环条件就可以判断x>answer
也就是:
int ans = 0;
while (x > ans) {
ans = ans * 10 + x % 10;
x /= 10;
}
最后整理一下特殊情况:
class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int ans = 0;
while (x>ans) {
ans = ans * 10 + x % 10;
x /= 10;
}
return (x == ans || x == ans / 10);
}
}
优化成功!