妙解回文数,快速尝试不可少

860 阅读2分钟

这是我参与新手入门的第2篇文章

一、题目描述

9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

二、思路分析

  • 回文数就是数字是对称性质的。常规解法就是直接将数字进行反转然后和原数字进行比对。将数字进行反转在Java中实现也很简单。
  • 实现反转就是先将数字转成字符串。利用Java自带的反转得到结果。
public boolean isPalindrome(int x) {
    String str = String.valueOf(x);
    return new StringBuilder(str).reverse().toString().equals(str);
}

image-20210705135410188.png

  • 这种比较投机取巧,下面我们来通过算法分析实现回文数判定!
  • 首先,我们可以针对特殊情况进行判定这样可以快速判定,提高程序效率。比如说对于个位数都满足回文数的要求。
  • 其次对于负数来说就不是回文数,因为一个负数只会出现在数字前部不会出现在其他地方。
  • 所有个位数是0的都不是回文数,因为各位为0 的情况如果是回文数那么第一位必然是0,我们知道自然数中不会是0开头的。
  • 以下取自leetcode官网分析图片。从图片中我们也能够看得出我们需要针对奇偶性进行区别对待!

image-20210705140335249.png

  • 我们没必要一直反转到结束,反转的数字从0开始,一开始比源数字小,知道反转数字大于等于源数字表示我们无需反转了。
public boolean isPalindrome2(int x) {
    if (x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }
    int result = 0;
    while (result < x) {
        result = result * 10 + x % 10;
        x /= 10;
    }
    return x == result || x == result / 10;
}

三、总结

  • 回文数是leetcode简单之一,也是面试常考点。主要考察我们对算法的时间空间复杂度的了解。