算法:回文数

回文数


算法描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。 -121不是回文,因为 从右向左读, 为 121-

提示:不用将整数转换成字符串处理。

算法实现

java 复制代码
	public boolean isPalindrome(int x) {
		if(x<0) {//因为负数肯定不是回文数
			return false;
		}
		int reversX=reverse(x);
		return reversX==x;
	}
	
	//数字翻转
	public int reverse(int x) {
	    int res = 0;
	    int MAX = Integer.MAX_VALUE;//2147483647
	    while (x != 0) {
	        int digit = x % 10;//取当前最后一位数字,比如12345取5
	        x = x / 10;// 去掉最后一位,比如12345变成1234
	        
	        // 预判溢出,如果 res * 10 + digit > MAX
	        if (res > MAX / 10 || (res == MAX / 10 && digit > 7)) {
	            return 0;
	        }
	      
	        res = res * 10 + digit;
	    }
	    return res;
	}

算法解析

避坑提醒

  • 不能先算 res*10+digit 再比较,因为可能会超出 int 范围会发生数值截断,判断失效;
  • 不能用 long 中转(部分面试要求纯 int 运算,不允许更大类型);

溢出判断

java 复制代码
MAX = 2147483647
MAX / 10 = 214748364

情况 1:res > MAX / 10

设 res = 214748365

res * 10 = 2147483650

哪怕 digit = 0,结果是 2147483650

2147483650 > 2147483647,一定溢出

这里的逻辑是:

res 只要大于 214748364,res×10 本身就已经大于 MAX,再加任何 0~9 的 digit,只会更大,必然溢出。

情况 2:res == MAX / 10

res*10 = 2147483640

digit ≤7:2147483640 + digit ≤ 2147483647,安全

digit ≥8:2147483640 + digit ≥ 2147483648,溢出

情况 3:res < MAX / 10

res×10 最大为 2147483630,加 9 也只有 2147483639 < MAX,永远安全