Leetcode-9. 回文数

323 阅读2分钟

题目

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

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

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

示例 4:

输入:x = -101
输出:false

提示:

-231 <= x <= 231 - 1

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/pa…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结题思路

  1. 转字符串 将整数转为字符串,然后从两边往中间依次验证所取到的数字是否相等。

  2. 数字反转比较 将整数进行反转,得到数字记为rever,如果rever与原数字相等,则是回文数。但是由于int类型,可能反转的过程中发生溢出的情况,只需要对数字的一半进行反转,看其是否等于另一半。这种做法的另一个好处就是缩短一半的计算量。
    反转的过程就是将x的个位取出来,然后rever=rever*10+个位,直到反转一半的时候结束。那么什么时候算反转了一半呢?即当x < rever的时候就已经反转了一半的个数,此时应该停止。
    因为数字个数奇偶数的不同,有两种情况,具体如下:

image.png

代码

  1. 转字符串
public boolean isPalindrome(int x) {
    char[] s = String.valueOf(x).toCharArray();
    int lenth = s.length;
    int end = lenth - 1;
    for (int i = 0; i < lenth/2; i++, end--) {
        if (s[i] != s[end]) {
            return false;
        }
    }
    return true;
}
  1. 数字反转比较
public boolean isPalindrome(int x) {
    // 对负数和个位为0的情况特殊处理
    if (x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }

    int rever = 0;
    while (x > rever) {
        rever = rever * 10 + x % 10;
        x /= 10;
    }

    return x == rever / 10 || x == rever;
}

测试用例

public class Solution_Test_9 {
    Solution_9 solution_9 = new Solution_9();

    @Test
    public void test1() {
        int x = 121;
        boolean ans = solution_9.isPalindrome(x);
        assertEquals(ans, true);
    }

    @Test
    public void test2() {
        int x = -121;
        boolean ans = solution_9.isPalindrome(x);
        assertEquals(ans, false);
    }

    @Test
    public void test3() {
        int x = 10;
        boolean ans = solution_9.isPalindrome(x);
        assertEquals(ans, false);
    }

    @Test
    public void test4() {
        int x = -101;
        boolean ans = solution_9.isPalindrome(x);
        assertEquals(ans, false);
    }
}