此题来自力扣 9.回文数
目录
题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是
- 示例1
输入:x = 121
输出:true
- 示例2
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数
- 示例3
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数
- 示例4
输入:x = -101
输出:false
题解思路
首先,看到之后有两种思路,一种就是把数字转换为字符串然后全部反转,反转后数字和原始数字比较,如果相等,那就是回文数.
第二种就是反转一半长度的数字,然后去跟另外一半数字对比,看是否相同. 举例说明一下:
数字: x = 12321, 因为其的一半反转数字为123 (下面解释为什么是123, 不是12)
- 负数直接返回false
- 结尾是0的(除了0以外),也就是 (x%10=0且x!=0),因为结尾是0,反转之后第一个数字为0,显然是错误的.返回false
- 先 x%10 求出余数 1, 然后再去用 x/10 求出整数 1232, 继续重复操作, 1232%10 余 2, 再去1232/10 求整数 123, 用前面的余数 1 * 10 + 2(当前的余数) =12, 再用 123%10余数3, 123/10求整数为12, 再用上面得到的12*10 + 3(当前的余数) = 123, 此时x已经等于12, 而反转的数字等于123了
- 这里就是判断数字反转的长度是否达到一半长度, 当反转的数字大于或等于未反转的数字.那么就是反转够一半长度了.就停止反转.所以是反转之后的数字是123, 未反转的是12
但是呢,在奇数长度下,得到反转的数字为123, 未反转的为12, 相对于当前例子来说,中间的数字为3,中间的数字为任意一个数字都不会影响是否是回文数,所以用123/10求出整数值为12. 再拿得到的12和未反转的数字做比较,发现相等,即是回文数.
当然,在偶数长度下,不需要去/10求整数值,直接判断是否反转的数字和未反转是否相等即可. 所以最后的返回应该是 (反转的数字 = 未反转的数字) 或 (反转的数字/10 = 未反转的数字) , 只要满足一个就是回文数
代码
// PHP
class Solution {
/**
* @param Integer $x
* @return Boolean
*/
function isPalindrome($x) {
if(isset($x)){
$string = strrev(strval($x));
//$a = intval($string);
$a = (int)$string;
if($a === $x) {
return true;
}
}
return false;
}
}
// PHP
class Solution {
/**
* @param Integer $x
* @return Boolean
*/
function isPalindrome($x) {
$a = false;
if($x>=0) {
$a = strrev(strval($x)) == strval($x) ?: false;
}
return $a;
}
// PHP
// 判断一般长度的数字
class Solution {
/**
* @param Integer $x
* @return Boolean
*/
function isPalindrome($x) {
if($x<0 || ($x % 10 == 0 && $x != 0)) {
return false;
}
$int = 0;
while($x > $int) {
$int = $int * 10 + $x%10;
$x = floor($x/10);
}
return $x == $int || $x == floor($int/10);
// if($x == $int || $x == floor($int/10)) return true;
// return false;
}
}
// Java
class Solution {
public boolean isPalindrome(int x) {
if(x<0 || (x%10==0 && x != 0)) {
return false;
}
int num = 0;
while(x > num){
num = num * 10 + x%10;
x/=10;
}
return x == num || x == num/10;
}
}