空间复杂度为O的回文数判定算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了空间复杂度为O的回文数判定算法相关的知识,希望对你有一定的参考价值。

空间复杂度为O(1)的回文数判定算法

一、题设

  实现空间复杂度为O(1)的回文数判定,输入为整型常数,要求输出判断是否为回文数。

  要求格式如下:

public boolean isPalindrome(int x) {
    //Your judge code    
}

二、概念

  回文数(Palindrome)的定义:设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。

  特点:

  1.负数、小数不是回文数;

  2.回文数可以是奇数个或者偶数个数字;

三、分析

  根据回文数的定义,在本题设的程序设计中,应该注意以下几点:

  1.当回文数倒置后可能存在溢出的情况;

  2.空间复杂度为O(1)要求变量定义个数不能过多,若是一个输入,则自定义的变量应该定义为1个及以内;

四、算法

  设输入的数据为X。

  1.若X小于0或者X为10的N次方(N>=1),则返回FALSE;

  2.设比较变量REV为0,REV每次增加X的最后一位数字并且X每次去除最后一位数字,若REV小于等于X,则继续2步骤,否则进入步骤3;

  3.输出最终结果,如果REV等于X或者REV除10取整等于X,则X为回文数,否则不为回文数。

五、JAVA代码

public class PalindromeNumber {

    public static void main(String[] args) {
        PalindromeNumber p = new PalindromeNumber();
        System.out.println(p.isPalindrome(32233223));
    }
    
    public boolean isPalindrome(int x) {
        if(x < 0 || (x != 0 && x % 10 == 0)) {
            return false;
        }
        int rev = 0;
        while(x > rev) {
            rev = rev * 10 + x % 10;
            x = x / 10;
        }
        return (x == rev || x == rev / 10);
    }

}

六、优点

  1.该算法只额外定义了一个临时变量rev,而没有通过定义字符串,然后进行循环比较;

  2.通过rev的不断增长以及x的不断缩短,使两者最终趋于x/2的长度,不会出现溢出的情况;

  3.性能非常高,所占的时间空间都非常低。

以上是关于空间复杂度为O的回文数判定算法的主要内容,如果未能解决你的问题,请参考以下文章

链表的回文结构

链表的回文结构

马拉车算法详解

Manacher算法最长子回文串

回文链表

LeetCode 9. 回文数