Determine whether an integer is a palindrome. Do this without extra space.
题目描述:判断一个数字是否为回文数组,不允许使用辅存。
解法一:将数字x翻转后存于一个long中(防止溢出)
leetcode通过时间为:9ms(不推荐,比较用long来解决溢出并不是题目希望的,目前未想到其他解决溢出的方法)
public boolean isPalindrome(int x)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> if(x<0)
<span style="white-space:pre"> </span> return false;
<span style="white-space:pre"> </span>int temp = x;
<span style="white-space:pre"> </span>long rs = 0;
<span style="white-space:pre"> </span>while(temp != 0)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>rs = rs*10+temp%10;
<span style="white-space:pre"> </span>temp/=10;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(rs == x)
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
解法二:模拟从两边向中间靠拢
例如输入1234321
首先细算最左边的位数left = 1000000;
然后数字 x 除 left 得到最左边的数字 a
x 对10取余得到最右边的数字 b
判断a b两个数字是否相等,不等则返回false,相等则继续。
然后对数字 x 进行处理,目标是:从1234321 变成 23432
① 将x对left取余的结果赋予x
② 即x从1234321变为234321
③ 再将x除10 得到目标23432
最后对left进行处理
x以及减少2位了,故left = left/100;
循环以上步骤直至left == 0
代码如下:
leetcode通过时间为10ms
public boolean isPalindrome(int x) {
if(x<0)
return false;
else if(x<10)
return true;
int left = 1;
int right = 10;
int temp = x;
while((temp/=10)!=0)
{
left*=10;
}
while(left>0)
{
if(x/left != x%right)
return false;
x=(x%left)/10;
left/=100;
}
return true;
}