关于LeetCode中Palindrome Number一题的理解

来源:互联网 发布:matlab 两个矩阵拼接 编辑:程序博客网 时间:2024/06/07 00:52

题目如下:

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

    判断一个数是否为“回文数”,禁止使用额外的存储空间。

    按例奉上自己的Low B思路及已Accepted的代码。我第一眼看到这个题目的时候想法很简单,先查看给定数的最高位和最低位的数值是否相等,然后查看次高位和次低位的数值是否相等,以此类推,若高位和低位每次的值都相等,那么这个数就是“回文数”。那么下面的问题就是如何方便地判断高位和低位的值是否相等,很一般的思路就是先将这个Int类型的给定数转化成字符串,然后再使用chatAt()函数获取“高位”和“低位”的数字,之后就可以通过“==”判断这两个“数字”(其实在字符串中就是两个char类型的字符,char属于基本类型,可以通过"=="来比较是否相同)是否相同。大致思路就是这样,实现代码如下:

<span style="font-size:14px;">public boolean isPalindrome(int x) {        if(x<0){            return false;        }        String mid = x + "";        int strLength = mid.length();        for (int i=0;i<strLength/2;i++){                    if(mid.charAt(i) == mid.charAt(strLength-1-i)){                        continue;                    }else{                        return false;                    }        }        return true;    }</span>
    然后是每次博客的重头戏,分析一个在评论区叼叼的思路。如果一个数是“回文数”的话,那将这个数从中间“劈”开,两边的数字应该是互为镜像的,那我们只要证明这一点就可以说明这个数是“回文数”了。但是“镜像”又不是那么容易进行比较,所以我们需要通过一些方法把其中的一侧“镜像”正过来,然后比较和另一侧“镜像”比较是否相等,如果相等,说明之前是互为“镜像”的,否则则说明不是互为“镜像”的。说起来比较容易,但是实现起来还是不容易想到的,下面直接看一下代码实现:

<span style="font-size:14px;">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);}</span>
咱们举个例子:

假设输入的x为12321

rev最开始为0

x=12321>rev=0 进入第1次循环:

    rev=0*10 + 12321%10 = 0 + 1 = 1

    x = 12321/10 = 1232

x=1232>rev=1 进入第二次循环:

    rev=1*10 + 1232%10 = 10 + 2 = 12

    x = 1232/10 = 123

x=123>rev=12 进入第三次循环:

    rev=12*10 + 123%10 = 120 + 3 = 123

    x = 123/10 = 12

x=12<rev=123 循环结束

    return true (x=12 等于rev/10=12)


若初始x=1221,则最后结果是利用x=rev=12返回的true值。

程序中巧妙地利用rev来反应“镜像”这种情况,而两种不同的判断方式则对应了输入值位数为奇数和偶数的情况(奇数的情况循环最后相当于右侧“镜像”比左侧“镜像”多出一位来,所以要进行除10操作来判断剩下的结果和左侧“镜像”是不是相等的)



1 0
原创粉丝点击