LeetCode-Palindrome Number

来源:互联网 发布:亚瑟士淘宝假货多吗 编辑:程序博客网 时间:2024/05/17 01:35

题目

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);    }

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



0 0
原创粉丝点击