回文数判断 leetcode第九题

题目如下:

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

 思路: 先排除负数,因为负数都不是回文数, 第一种思路是将数据转化为字符串,再反转该字符串,然后进行判断是否与原字符串相等

但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二种思路是利用数学方法将数据反转,然后比较是否与原数据相等. 但是,如果反转后的数字大于 int.MAX,我们将遇到整数溢出问题。

所以可以将int先转化为long类型再反转,(还有一种思路是不转成long,如果反转后溢出,则说明他不是回文数,回文数反转以后一定是它本身,所以一定不会溢出)

第一种思路的代码如下:

public static boolean isPalindrome02(int x) {
if (x < 0) {
return false;
}
StringBuffer stringBuffer = new StringBuffer(Integer.toString(x));
String string = stringBuffer.toString();
// StringBuffer stringBuffer2 = stringBuffer; // 他们的值是绑定的,因为在赋值后,他们的指针指向同一块内存地址,所以一个改变,
// 另一个也会改变(除了特殊需求,一般不用StringBuffer相互赋值)(StringBuffer和string不能一起比较,要转换为同类型比较)
stringBuffer.reverse();
if (string.equals(stringBuffer.toString())) {
return true;
} else {
return false;
}
}

在用这种方法时要注意stringBuffer 与string的区别1,他们的值是绑定的,因为在赋值后,他们的指针指向同一块内存地址,所以一个改变,
另一个也会改变(除了特殊需求,一般不用StringBuffer相互赋值)2,StringBuffer和string不能一起比较,要转换为同类型比较

第二种思路代码如下:
public static boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
long ret = 0;//使用long 避免数据溢出int类型范围
long num = x;
long tem;
while (num != 0) {
tem = num % 10;
ret = ret * 10 + tem;
num /= 10;
}
return ret == x;
}
第二种方法用的是数学的方法,较第一种节约性能一点
posted @ 2021-03-12 11:04  小猫爱哭鬼  阅读(75)  评论(0编辑  收藏  举报