leetcode第九题 回文数

题目

给你一个整数 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

解题思路一

  1. 拿出头元素和尾元素对比,然后头增尾减,在对比,一直到不能在对比为止。

  2. 通过取整和取余操作不断去对比首尾元素,并将比较完的首尾元素去掉。

代码

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0){
            return false;
        }
        int div = 1;
        while(x / div >= 10){
            div = div * 10;
        }
        while(x > 0){
            int left = x / div;
            int right = x % 10;
            if(left != right){
                return false;
            }
            x = (x % div) / 10;
            div = div / 100;
        }
        return true;
    }
}

解题思路二

直接拿这串数字的后半段进行翻转,然后与前半段进行比较,判断是否相等

具体细节

  1. 每次进行取余操作 ( %10),取出最低的数字:y = x % 10

  1. 将最低的数字加到取出数的末尾:lastReverse = lastReverse * 10 + y

  1. 每取一个最低位数字,x 都要自除以 10

  1. 判断 x 是不是小于 lastReverse ,当它小于的时候,说明数字已经对半或者过半了

  1. 最后,判断奇偶数情况:如果是偶数的话,lastReverse 和 x 相等;如果是奇数的话,最中间的数字就在lastReverse的最低位上,将它除以 10 以后应该和 x 相等。

这是copy别人的过程,这里解释一下为什么写x > lastReverse,我一开始是不理解的,比如这么个例子:123111,翻转数要一直取到1113才能满足x不大于lastReverse,但是转念一想,既然是判断回文,当数的位数是偶数位的时候,那么当走到中间的时候一定满足前x/2位等于后x/2位的反转,所以可以用x>lastReverse作为约束条件

代码

class Solution {
    public boolean isPalindrome(int x) {
​
        //解法二:
        if(x < 0 || (x % 10 == 0 && x != 0)){
            return false;
        }
        int lastReverse = 0;
        while(x > lastReverse){
            lastReverse = lastReverse * 10 + x % 10;
            x = x / 10;
        }
        return x == lastReverse || x == lastReverse / 10;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值