leetcode回文数
题目描述:判断一个数是否是回文数,即正序(从左向右)和倒叙(从右向左)读是否都是同一个整数
解法:
1、把整数转换为字符串,遍历字符判断是否正确(比第二种快)
2、结合数学解法,利用栈把数字存储起来,然后再弹出栈
转换为字符串:只要用两个指针,从头和尾开始遍历到字符串长度的一半就可以了
class Solution {
public boolean isPalindrome(int x) {
String s=null;//先定义一个字符串变量,接收整数转换
s=Integer.toString(x);//转换
int length=s.length();//记录字符串长度
int number=0;
boolean flag=true;//记录返回值
if(x<0)//负数不用考虑,直接返回false
{
return false;
}
else//x>=0
{
if(length%2!=0)//当x为奇数时
{
number=length/2+1;//如11211,number记录的位置就要是'2'的位置
for(int i=0, j=length-1;i<j;i++,j--)
{
if(s.charAt(i)!=s.charAt(j))
{
flag= false;//如果发现一个字符不一样了,直接改变布尔值,结束循环,可节约时间
break;
}
}
}
if(length%2==0)//偶数不用考虑太多
{
number=length/2;
for(int i=0, j=length-1;i<j;i++,j--)
{
if(s.charAt(i)!=s.charAt(j))
{
flag= false;
break;
}
}
}
}
return flag;
}
}
利用栈(先破坏后还原):思路是把x%10,取得最小位的数字入栈,把整个数字按照此方法入栈之后,再把栈的内容出栈,用数学的方法还原成刚开始的数字,如果入栈和出栈得到的数字相等,就返回true
class Solution {
public boolean isPalindrome(int x) {
if(x<0)
{
return false;
}
int number=x;int rev=0;int pow=1;
Stack<Integer> stack=new Stack<>();
while(x>0)
{
stack.push(x%10);//把121拆分成1,2,1入栈
x/=10;
}
while(!stack.isEmpty())
{
rev=rev+stack.pop()*pow;//出栈是0+1*1 1+2*10 21+1*100
pow*=10;
}
return number==rev;//相等就true,不等就false
}
}