空间复杂度为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.性能非常高,所占的时间空间都非常低。
时间: 2024-12-28 11:58:56