码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-08-08 17:52:40      阅读:496      评论:0      收藏:0      [点我收藏+]

标签:stat   ring   数字   否则   等于   分析   长度   循环   注意   

空间复杂度为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(1)的回文数判定算法

标签:stat   ring   数字   否则   等于   分析   长度   循环   注意   

原文地址:http://www.cnblogs.com/gdyblog/p/isPalindrome.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!