欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 回文数(巧解)

程序员文章站 2022-07-15 11:21:27
...

LeetCode 回文数

@author:Jingdai
@date:2020.09.23

题目描述(9题)

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。如121、123321。

思路

判断回文数非常简单,就和字符串判断回文一样,一个双指针就可以解决。但是需要额外多创建一个字符串,这里不用这种方法,用一种比较巧妙的方法解决这个问题。

首先想到可以将整个整数翻转,如果翻转得到的数字和原来的数字一样,则代表是回文数,否则不是。有些细心的童靴可能会想到有整数溢出问题,但是其实不用考虑,如果翻转得到数会溢出,那他肯定不是回文数,因为如果一个可以溢出的数是回文数,那么他自己一定是溢出的数,但它又是一个int,这样就矛盾了,所以翻转溢出的数肯定不是回文数。代码见片段1。

其实还有更加巧妙的方法,我们可以取出整数的前一半和后一半,将后一半翻转,如果后一半翻转后和前一半相同,则代表是回文数,否则不是。那我们怎么知道取到了一半了呢,其实只要翻转的数比原始的数大或者相等就代表到了一半了,看下图就懂了。

LeetCode 回文数(巧解)

如果长度为偶数,则翻转后的数和前一半相等,代表是回文数,如果长度是奇数,则翻转后的数/10和前一半相等,代表是回文数。代码见片段2。

代码

  • 片段1

    public static boolean isPalindrome(int x) {
        if (x == 0) {
        	return true;
        }
        if (x < 0 || x % 10 == 0) {
        	return false;
        }
        int preX = x;
        int reverse = 0;
        while (x != 0) {
        	reverse = reverse * 10 + x % 10;
        	x /= 10;
        }
        return reverse == preX;
    }
    
  • 片段2

    public static boolean isPalindrome(int x) {
    
    	if (x == 0) {
    		return true;
    	}
    	if (x < 0 || x % 10 == 0) {
    		return false;
    	}
    
    	// reverse the seceond half of x(post)
    	int reverse = 0;
    	while (x > reverse) {
    		reverse = reverse * 10 + x % 10;
    		x /= 10;
    	}
    
    	//       12344321   || 12321
    	return reverse == x || reverse/10 == x;
    }