LeetCode-Palindrome Number

题目

Determine whether an integer is a palindrome. Do this without extra space.

这种回文类型的题目以前都是做过的,比如字符串是否回文,一般的算法如下:

public boolean isPalindrome(String x) {
        char[] chars = x.toCharArray();
        for (int i = 0, j = chars.length -1; i < j; i++, j--) {
        	if (chars[i] != chars[j]) {
        		return false;
        	}
        }
        return true;
    }
定义两个指针i和j,一个指向前端,往后移;一个指向末端,往前移。终止条件就是两个即将重叠,或者中间有一个数字。

在看本题,加了严格的要求。不能使用额外的空间,所以第一反应将其转化为字符数组的方案就被堵死了。另外一个思路就是讲数字倒序,比较两个数字是否相等。将整型倒序的代码如下:

public int reverse(int x) {
		long result = 0;
		while (x != 0) {
			result = result * 10 + x % 10;
			x /= 10;
		}
		return result > Integer.MAX_VALUE || result < Integer.MIN_VALUE ? -1 : (int)result;
	}
为了防止倒序之后整型逸出,上面做了一些处理,比如使用long值,逸出时返回-1。所以根据上述方法,本题可以这样解题:

public boolean isPalindrome(int x) {
        if (x < 0)
        	return false;
        int reverse = reverse(x);
        if (reverse < 0) {
        	return false;
        }
        return x == reverse;
    }
此方法肯定可以,但是是不是够简洁,可以优化的。可以先看字符串那个示例,当然他也可以采取把字符串倒序之后比较,但是明显上面那两个指针的方法更简洁高效。同理,这个可以不以值倒序一部分呢?

public boolean isPalindrome(int x) {
    	if (x < 0 || x != 0 && x % 10 == 0)
            return false;
        int y = 0;
        while (y < x) {
        	y = y*10 + (x%10);
        	x /= 10;
        }
        return (x == y || y / 10 == x ? true : false);
    }

代码精炼了不少,并且也不会出现逸出的现象



你可能感兴趣的:(LeetCode-Palindrome Number)