用java判断回文数的两种方法

题目在这里

方法一:每次判断数字的首跟尾是否相同

  1. 首先,负数当然不是回文数,因为最前面的负号会跑到最后面,变成一个不是数字例如231-
  2. 然后如何求得一个数的第一位呢,就比如23412这个五位数,我们只需要让这个数除以10000即可,也就是这个五位数除以一个10的四次方的数,剩下来的就是第一位,末尾只需要%10就可以求得。
  3. 求得首位跟末位之后,只需要判断是否相等即可,不相等就返回false,如果相等,那么我们要除去首位跟末尾,先除去首位,只需要减去当前这个数的首位 * 对应的10的多少次方即可,上述的23412只需要减去2 * 10000就可以了,然后这个五位数变成了3412,除去最后一位只需要/10即可。

为什么不先去尾再去首位?

因为去尾永远都是/10这个操作,而如果你后去除首位的话,那么除的数会是10000少一位,也就是说会更加繁琐,所以我们可以将去尾放在后面(不过这个好像也没有那么繁琐,主要是这种思路,如果会换一种顺序会更加简单,那么就不需要按照复杂的那种顺序来解决问题

最后一步:我们只需要将位数-2即可,23412这个数首位跟末位判断过之后,我们将数字处理位341,接下来取首位应该是除以100,很明显这个就是10的3次方,所以那个次方的数要减一个2

AC代码

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0) return false;
        int y = x;
        int cnt = 0;
        while(y != 0) {
            cnt++;
            y /= 10;
        }
        cnt--;
        int n1,n2;
        while(x != 0) {
            n1 = x / (int)Math.pow(10, cnt);
            n2 = x % 10;
            if(n1 != n2) return false;
            x -= n1 * Math.pow(10, cnt);
            x /= 10;
            cnt -= 2;
        }
        return true;
    }
}

方法二:转化为字符串处理

首先负数还是判断为非回文数,转化为字符串的话只需要从中间隔开,然后从头开始依次比较前和后就可以了,偶数跟奇数都是位数/2,因为字符串从0开始,所以要减去一

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0) return false;
        String str = String.valueOf(x);
        int len = str.length();
        for(int i=0;i<=(len/2-1);i++) {
            if(str.charAt(i) != str.charAt(len-i-1)) return false;
        }
        return true;
    }
}

你可能感兴趣的:(java)