数据结构和算法分析算法提高之LeetCode刷题

Python实现判断回文数算法

2019-07-21  本文已影响0人  只有我最可爱c

回文数的定义:回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。


示例1:

输入:121

输出:True

示例2:

输入:-121

输出:False

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

示例3:

输入: 10

输出: false

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


思路:

映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二个想法是将数字本身反转,但是这样做有一个风险,32位机器的int类型最大值为2147483647,反转后的数字可能超出范围造成溢出。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 int\text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

例如,输入 1221,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文。


算法:

首先我们要处理一些特殊情况,负数不可能是回文数,首先要禁止负数进入。

然后再考虑如何反转数字,例如1221,首先1221%10就可以得到最后一位数字1,然后将1221/10得到122,再次122%10得到倒数第二位数字2,最后用1*10+2=12就得到了我们反转后的数字12,用12和原数字的前两位对比即可判断该数字是不是回文数。

还存在一个问题:我们怎么知道自己反转了一半呢?

我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

代码实现:

Python

class Solution(object):

    def isPalindrome(self, x):

        """

        :type x: int

        :rtype: bool

        """

        if x<0 or (x % 10 == 0 and x != 0):

            return False

        y=0

        while(x>y):

            y=x%10+y*10

            x /= 10;

        return x==y or x==y/10

Java

class Solution {

    public boolean isPalindrome(int x) {

        if(x < 0 || (x % 10 == 0 && x != 0))

            return false;

        int res = 0;

        while(x > res){

            res = res * 10 + x % 10;

            x /= 10;

        }

        return x == res || x == res / 10;

    }

}

上一篇 下一篇

猜你喜欢

热点阅读