首页 > 试题广场 >

回文数字

[编程题]回文数字
  • 热度指数:38706 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在不使用额外的内存空间的条件下判断一个整数是否是回文。
回文指逆序和正序完全相同。


数据范围:
进阶: 空间复杂度 ,时间复杂度

提示:
负整数可以是回文吗?(比如-1)
如果你在考虑将数字转化为字符串的话,请注意一下不能使用额外空间的限制
你可以将整数翻转。但是,如果你做过题目“反转数字”,你会知道将整数翻转可能会出现溢出的情况,你怎么处理这个问题?
示例1

输入

121

输出

true
示例2

输入

122

输出

false
判断一个整数是不是回文,并且要求不能使用额外的空间。
方法:迭代的对最高位和最低位,进行比较,一旦发现一个不相等就返回false
取一个整数的最低位可以使用x%10
取一个整数的最高位需要知道最高是哪一位 个、百、千 ····
判断一个整数的最高位是哪一位:
int hi=0;
while(x/hi>=10)
  hi*=10;
从而最高位为x/hi
去掉最高位和最低位后: x=(x%hi)/10  , hi=hi/100 
所以:
while(x!=0){
int left = x/hi;
int right = x%10;
if(left!=right) return false;
x=(x%hi)/10;
hi=hi/100;
}

发表于 2016-05-09 17:01:13 回复(5)
=测试样例好像正数都是回文数,我看到题目第二行还没看剩下的,本着“骗分过样例,暴力出奇迹”想法,先随便提交了一下。竟然AC了。建议牛客修改一下测试样例。
public class Solution {
    public boolean isPalindrome (int x) {
        return x < 0 ? false: true;
    }
}


发表于 2020-06-21 15:55:17 回复(5)

数学解法

主要思想就是每次将数字的第一位和最后一位进行对比。
如果不相等直接返回false,相等则将数字的第一位和最后一位去掉,重复以上流程。

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        int div = 1;
        while (x / div >= 10) {
            div *= 10;
        }
        while (x > 0) {
            int left = x / div;
            int right = x % 10;
            if (left != right) {
                return false;
            }
            x = x % div / 10;
            div /= 100;
        }
        return true;
    }
}
发表于 2019-11-05 15:26:02 回复(1)
class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0)
            return false;
        int reverse = 0;
        int t = x;
        while (t){
            reverse = reverse * 10 + t % 10;
            t /= 10;
        }
        return reverse == x;
    }
};

发表于 2016-05-23 21:40:35 回复(2)
class Solution {
public:
    bool isPalindrome(int x) {
        if(x<0) return false;
        int res=0;
        int temp=x;//把x的值存在temp
        while(x>0){
            res=x%10+res*10;
            x=x/10;//res是x的倒叙,但此时x已经不是原来值了
        }
        return(temp==res);
    }
};
发表于 2018-04-08 15:12:25 回复(1)
public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) return false;
        long res = 0;
        int num = x;
        while (x != 0) {
            res = res * 10 + x % 10;
            x = x / 10;
        }
        return res == num;
    }
}

发表于 2017-11-29 19:22:51 回复(0)
class Solution {
public:
    bool isPalindrome(int x) {
        if( x < 0 || (x > 0 && x%10 == 0))
            return false;
        int n = x;
        int sum = 0;
        while(n)
        {
            sum = sum*10 + n%10;
            n /= 10;
            if(sum >= n)
                break;
        }
        return sum == n || sum/10 == n;
    }
};

发表于 2017-08-24 20:49:16 回复(1)
func isPalindrome( x int ) bool {
    // write code here
     if x < 0 || (x%10 == 0 && x !=0) {
        return false
    }
    revertNum := 0
    for x > revertNum {
        revertNum = revertNum*10 + x%10
        x /= 10
    }

    return x== revertNum || x == revertNum/10
}

发表于 2022-04-23 20:59:41 回复(1)
看到回文 。。。。 
class Solution:
    def isPalindrome(self , x: int) -> bool:
        # write code here
        return str(x)==str(x)[::-1]


发表于 2022-01-15 22:50:11 回复(0)

转换成string然后比较就行了

bool isPalindrome(int x) {
        if(x<0) return false;
        stringstream ss;
        ss<<x; 
        string s1 = ss.str();
        int len = s1.size();
        for(int i=0;i<len/2;++i){
            if(s1[i]!=s1[len-i-1])return false;
        }
        return true;
    }
发表于 2021-09-12 10:20:01 回复(0)
class Solution {
public:
  bool isPalindrome(int x) {
    if (x < 0) return false;
    int _x = x;
    long int n = 0;
    while (_x) {
      n = (n << 1) + (n << 3) + _x % 10;
      _x /= 10;
    }
    return n == x;
  }
};

发表于 2021-08-25 11:11:56 回复(0)
在整数反转的基础上做这道题 带溢出判断
function isPalindrome( x ) {
    // write code here
   if(x>=0){ /// >=0的时候做整数反转 判断翻转后的数字是否和原数字相等
        let res = 0,a = x
    while(a!==0){
        res = res*10 + a% 10
        a = (a/10) |0
    }
     (res|0) === res? res : 0
     return res == x ? true : false
    }
    return false  //小于0 肯定不是回文数字
}

发表于 2020-12-28 16:35:16 回复(0)
不reverse的版本
bool isPalindrome(int x) {
        // 若为负数,则不能为回文
        // 若为0,则是回文
        if (x <= 0) return x == 0;
        
        // 先求出位数,之后前后比较
        int digits = 0, num = x;
        while (num != 0) {
            digits ++; num /= 10;
        }
        
        while (digits > 1) { // 比较第一个和最后一个数字
            int first = x / pow(10, digits - 1);
            int last = x % 10;
            if (first != last) return false;
            x = (x - first * pow(10, digits - 1)) / 10;
            digits -= 2;
        }
        return true;
    }

发表于 2019-06-11 11:23:01 回复(0)
public class Solution {
    public boolean isPalindrome(int x) {
        if(x<0)
            return false;
        int temp = 0;
        while(temp<=x) {
            temp = temp*10+x%10;
            if(temp==x)
                return true;
            if(temp==0)//10的倍数
                return false;
            x = x/10;
            if(temp==x)
                return true;
        }
        return false;
    }
}
发表于 2019-03-03 21:53:08 回复(0)
    public boolean isPalindrome(int x) {
        if(x<0) return false;
        long reverse = 0;   //怕溢出,就用long
        long temp = x;
        while(true){           
            reverse = reverse * 10 + x % 10;
            x = x /10;
            if(x == 0) break;
        }
        return reverse == temp;
    }

发表于 2018-08-03 17:39:59 回复(1)

直接求解法

public boolean isPalindrome(int x) {
        if (x < 10) return x >= 0;
        int base = 1;
        for (int i = x; i > 9; base *= 10, i /= 10);
        for (;x > 0 && base > 0; base /= 100) {
            int head = x / base, tail = x % 10;
            if (head != tail) return false;
            x %= base;//掐头
            x /= 10;//去尾
        }
        return true;
    }
编辑于 2018-02-23 19:49:04 回复(0)
bool isPalindrome(int x) {
        if(x==INT_MIN)
            return false;
        if(x<0)
            return false;
           // x=abs(x);
        int help=1;
        while(x/help>=10)
            help*=10;
        while(x){
            if(x/help!=x%10)
                return false;
            x=(x%help)/10;
            help/=100;
        }
        return true;
    }

发表于 2017-11-06 10:20:44 回复(0)
class Solution {
public:
    bool isPalindrome(int x) {
        int y = x,z = 0;
        if(y < 0)
        	return false;
        	
        while(y)
        {
        	z = 10*z + y%10;
        	y /= 10;
		}
		if(z == x)
			return true;
		else
			return false;
    }
};

发表于 2017-07-24 00:44:12 回复(0)
class Solution {
public:
    bool isPalindrome(int x) {
        string s = to_string(x);
        for(int i = 0; i < s.size(); ++i){
            if(s[i] != s[s.size() - i - 1])
                return false;
        }
        return true;
    }
};

发表于 2017-07-03 16:38:32 回复(0)

compare half of the digits in x, so don't need to deal with overflow.

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); }
发表于 2017-03-13 00:15:18 回复(0)

问题信息

难度:
137条回答 20757浏览

热门推荐

通过挑战的用户