Leetcode第九题_Palindrome Number

本文探讨了如何高效地判断一个整数是否为回文数,提出了两种解决方案:一种是通过逐位比较来验证;另一种是通过反转整数并检查是否溢出来实现。这两种方法都避免了将整数转换为字符串的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Palindrome Number

Some hints:

Could negative integers be palindromes? (ie, -1)

If you are thinking of converting the integer to string, note the restriction of using extra space.

You could also try reversing an integer. However, if you have solved the problem “Reverse Integer”, you know that the reversed integer might overflow. How would you handle such case?

There is a more generic way of solving this problem.

这题一出来就啪啪啪的打我脸,把我想到的解法都羞辱了一番,于是我在梦中又想了想,不知道这个解法会不会是床说中的generic way。

因为是个int型的数,用这个数从最大的int型位数除起,直到商不为0,这样得到的第一个商就是第一位数,而用这个数对10取余就是最后一位数。再得到前两位数,对前两位数对10取余,得到第二位数。而后面用这个数对100取余,得到后两位数,再除以10,得到倒数第二位数。

public class Solution {


    public static boolean isPalindrome(int x) {
        int i = 9;
        int j = 1;
        int quo = 0;
        int rem = 0;

        if (x < 0) {
            return false;
        }
        if (x==0) {
            return true;
        }
//      通过判断商是否为零确定该整型数的位数
        while (quo == 0) {
            int div = 1;
            for (int k = i; k>0 ; k--) {
                div = div*10;
            }
            quo = x/div;
            i--;
        }
        i++;
//      判断该数是否为一个回文数
        while(i >= j){
            int deno = 1;
            int div = 1;
            for (int k = i; k>0 ; k--) {
                div = div*10;
            }
            quo = x/div;
//          得到最新需要比较的前段数
            quo = quo%10;
            for (int k = j; k>0 ; k--) {
                deno = deno*10;
            }
            rem = x%deno;
//          得到最新需要比较的后段数
            rem = rem/(deno/10);
            if (quo!=rem) {
                return false;
            }
            j++;
            i--;
        }
        return true;
    }
}

这是我想到的除了被hint鄙视了的第三种解法,有点复杂,当然,这里还有简洁的,直接逆置这个数字,开挂处理溢出的解法。但我没想到这个复杂的比直接逆置的效率要高。

public static boolean isPalindromes(int x) {
    int temp = x;

    long  reverse = 0;

    while (temp > 0){
        reverse = reverse*10 + temp%10;
        temp /= 10;
    }

    return reverse == (long)x;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值