回文数,拿来吧你

该篇博客详细介绍了如何判断一个整数是否为回文数的两种方法:字符串反转和数字反转。针对不同情况,如负数、以0结尾的数,提供了详细的逻辑分析,并给出了PHP和Java的代码实现。内容涵盖了算法思路和具体实现,适合对算法和编程感兴趣的读者。
摘要由CSDN通过智能技术生成

此题来自力扣 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值