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

空间复杂度为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

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

[小米]2015小米校招之回文数判断

[题目] 大家对回文串不陌生吧?一个字符串从前看和从后看如果一样的话,就是回文串,比如"上海自来水来自海上"就是一个回文串.现在我们的问题来了,把一个数字看成字符串,问它是不是一个回文数?时间复杂度和空间复杂度越低的算法,得分越高. c++: bool isPalindromeNumber(long num); java: boolean isPalindromeNumber(long num); [代码] #include <iostream> using namespa

LeetCode Problem 9:Palindrome Number回文数

描述:Determine whether an integer is a palindrome. Do this without extra space. 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 a

判断一个int 型整数 是否为回文数

leetcode 上的题目 Determine whether an integer is a palindrome. Do this without extra space. 由于不能使用额外空间,所以不能把数字转化为字符串后进行比较.因为这样空间复杂度将为线性. leetcode给出了几点提示 1.判断负数是否为回文数,查了下回文数定义,负数不为回文数 2.就是注意不能把数字转字符串,因为不能用额外空间. 3.如果打算反转数字,需要处理好数字溢出情况 我的解决办法: 先获取数字长度,然后获取

(LeetCode)Palindrome Number -- 判断回文数

Determine whether an integer is a palindrome. Do this without extra space. 解题分析: 题目很简单,但是对于要求需要看清楚. Some hints: Could negative integers be palindromes? (ie, -1) If you are thinking of converting the integer to string, note the restriction of using ex

【LeetCode题解】9_回文数(Palindrome-Number)

目录 9_回文数(Palindrome-Number) 描述 解法一:转化为字符串的比较 思路 Java 实现 Python 实现 复杂度分析 解法二:反转数字的后半部分 ★ 思路 Java 实现 Python 实现 复杂度分析 9_回文数(Palindrome-Number) 描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -

判断一个数是否为回文数

#include <stdio.h> int is_palindromic(int num) {  char _old = num;  char _new = 0;  while (num)  {   _new = _new * 10 + (num % 10);   num = num / 10;  }  if (_new == _old)  {   return 1;  }  else  {   return 0;  } } int main() {  int num = 0;  scanf

LeetCode 9 Palindrome Number (回文数)

翻译 确定一个整数是否是回文数.不能使用额外的空间. 一些提示: 负数能不能是回文数呢?(比如,-1) 如果你想将整数转换成字符串,但要注意限制使用额外的空间. 你也可以考虑翻转一个整数. 然而,如果你已经解决了问题"翻转整数(译者注:LeetCode 第七题), 那么你应该知道翻转的整数可能会造成溢出. 你将如何处理这种情况? 这是一个解决该问题更通用的方法. 原文 Determine whether an integer is a palindrome. Do this without ex

要求循环输入一个数,判断是否为回文数

import java.util.Scanner; public class HuiWenShu { public static void main(String[] args) { Scanner input = new Scanner(System.in); char c = 'y'; //初始化c为y,为下面的循环做好准备 while(c == 'y'){ while(c == 'y'){ System.out.println("请随意输入一个大于三位的奇位数"); //回文数属

回文数 第N个回文数

判断回文数还是不难,如果能转为字符串就更简单了. 如果是求第N个回文数呢. 12321是一个回文数,这里先考虑一半的情况. 回文数的个数其实是有规律的.如: 1位回文数: 9个 2位回文数: 9个 3位回文数: 90个 4位回文数: 90个 5位回文数: 900个 6位回文数: 900个 … 我们看到9.90.900,是不是很有规律,那是什么原因?很简单,我们把回文数拆开两半 [123321]来看.两半的变化一样的,那我们只算其中一半就行了.首位不能是0,所以左半最小为 100,最大为999,共