题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
进阶:你能不将整数转为字符串来解决这个问题吗?
思路
基础
当看完问题描述后,我的第一想法就是将数转换为字符串,通过对比的方式来判断该整数是否为回文数,这样的作法就需要我们创建字符数组,将该整数划分为一个一个的字符放进字符数组中,在通过循环遍历的方式,把字符数组从两端向中间进行对比,利用一个flag标志来标记是否为回文数,最后返回结果。
进阶
但是问题中有提示我们进行进阶求解即不使用字符串进行求解,因为我们知道,当使用字符串进行求解时,我们就需要创建非常量空间来进行字符串的比较,这会增加系统的开销,所以这里我们可以直接把整数以数学公式来进行反转通过对比数值的形式来判断是否为回文数,因为我们知道,回文数其正反两个状态的数值是相同的。
求解
话不多说直接上代码
基础
public static boolean isPalindrome(int x) {
boolean flag = true; //定义一个标志变量
String X = ""+x; //将整型入参变为字符串
char[] x1 = X.toCharArray(); //将入参字符串的各个字符放入字符数组中
for (int i=0;i<x1.length/2;i++) //for循环将字符数组从两端向中间进行比较,由于回文数的特性,所以我们只需比较到中间即可
if (x1[i] == x1[x1.length-1-i])
flag = true; //所有比较都通过即相等则flag赋true退出循环
else {
flag = false; //有一处不相等则flag赋false直接退出循环
break;
}
return flag; //返回变量
}
进阶
public boolean isPalindrome(int x) {
if (x == 0) return true; //显然,0为回文字,直接给出true
if (x < 0 || x % 10 == 0) return false; //显然,负数以及个位为零的整数不是回文数,直接给出false
int reversed = 0; //因为通过数学方式进行整数取反然后比较,所以定义一个整数变量
while (x > reversed) { //由于回文数的特性,所以我们只需比较一半便可知是否为回文数
reversed = reversed * 10 + x % 10; //总是将入参的末位数给到reversed
x /= 10; //去掉将入参的末位数,用于下一步的末位数转移以及比较位置的判断
}
return x == reversed || x == reversed / 10; //如果为偶数位数,则入参去位后应与reversed的值相等
} //奇数位数则reversed去一位后与入参去位后的值相等
}