题目:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
代码:
package leetCode;
import java.util.Scanner;
/**
* 回文数
* 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
*注意:当使用计算整数反转数存在整数溢出问题(字符串不存在)
*解决:仅仅计算反转的一半(正常情况下考虑的是得到整数的位数,同时用一个数计数),答案中使用计算的一半的数的值和x剩下的值比较,思路清奇,同时最后二者相等或者和倒一半的数除以10相等
* @author dhc
*
*/
public class Nine {
//根据计算的倒序整数和原数比较(未考虑整数反转溢出问题),虽然能够通过验证,但是存在溢出问题
public static boolean isPalindrome(int x) {
int x1 = x;
int y = 0;
if(x == 0) {
return true;
}
if(x > 0){
while(x > 0) {
y = y*10 + (x%10);
x = x/10;
}
if(x1 == y) {
return true;
}
}
return false;
}
//利用字符串
public static boolean isPalindrome1(int x) {
/*boolean flag = false;
String str = String.valueOf(x);
String str1="";
for(int i = str.length();i>0;i--) {
str1 = str1.concat(str.substring(i-1, i));
}
if(str.equals(str1)) {
flag = true;
}
return flag;*/
StringBuffer sb = new StringBuffer(String.valueOf(x));
String s = sb.toString();
String s1 = sb.reverse().toString();
return s.equals(s1);
}
//计算整数倒过来数的一半,考虑溢出问题
public static boolean isPalindrome2(int x) {
int reverseNum = 0;
//注意x不能以0结尾
if(x > 0 && x%10 != 0) {
while(x > reverseNum) {
reverseNum = reverseNum*10 + x%10;
x = x/10;
}
}
return reverseNum == x || x == reverseNum/10;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int x = input.nextInt();
System.out.println(isPalindrome(x));
}
}