回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最初的代码:

class Solution {
    public boolean isPalindrome(int x) {
        int newX = reverse(x);
        if(x  == newX)
        return true;
        return false;
    }
    //将该整数传入逆置函数,逆置该数
    public int reverse(int y){
        int num  = 0;
        int sum = 0;
        for (int i = y;i >= 0;i = i/10) {
             num = i%10;
             sum = sum * 10 + num;
        }
        return sum;
    }
}

以上代码结果:超出时间限制
经检查,问题一:由于for循环中的判断条件出现差错,导致死循环
问题二:并且没有判断如果输入的值为负数时该如何处理
改正后的代码如下:

方法一

class Solution {
   public static boolean isPalindrome(int x) {
        if (x < 0)  return false;
        int newX = reverse(x);
        return x  == newX;
    }
    //将该整数传入逆置函数,逆置该数
    public static int reverse(int y){
        int num  = 0;
        int sum = 0;
        for (int i = y;i != 0;i = i/10) {
             num = i%10;
             sum = sum * 10 + num;
        }
        return sum;
    }
}

在这里插入图片描述

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        int num = 0;
        int res = 0;
        for (int i = x;i != 0;i = i / 10) {
            num = i % 10;
            res = res * 10  + num;
        }
        return res == x;
    }
}

在这里插入图片描述
第二个代码看上去比第一个简洁许多,但是在执行效率和内存消耗上第一个代码更胜一筹。
为什么呢??

上述代码会出现内存溢出的情况,所以采用下述,只反转一半的方法

方法二

class Solution {
    public boolean isPalindrome(int x) {
        // 10 和 小于 0 的都是 false【特殊情况】
       if (x < 0 || (x % 10 == 0 && x != 0)) {
           return false;
       }
       // 将数字只反转一半
       // 当前一部分的个数 ≤ 后一部分的个数时,跳出循环
       // 说明已经遍历到位了 
       int reverseNum = 0;
       while (x > reverseNum) {
           reverseNum = reverseNum * 10 + x % 10;
           x /= 10;
       }
       // 数字的个数存在奇数和偶数的情况,所以要分成两个条件来写
       if (x == reverseNum || x == (reverseNum / 10)) 
           return true;
            return false;
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值