LeetCode【9、回文数】(简单)

157 阅读2分钟

题目描述

这是 LeetCode 上的 9. 回文数,难度为 简单

关键字: 数字反转回文数

给你一个整数 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

进阶:你能不将整数转为字符串来解决这个问题吗?


解题思路

我们首先的能想到的是将数字转换成字符串,然后判断字符串是否是回文字符串

class Solution {
    public boolean isPalindrome(int x) {
        // 数字转字符串
        String s = String.valueOf(x);
        int right = s.length() - 1;
        char[] cs = s.toCharArray();
        // 因为是判断是否是回文字符串,因此这里只需要遍历一般的字符就可以了
        int mid = right / 2;
        for (int i = 0; i <= mid; i++) {
            // 判断对应位置字符是否一致
            if (cs[i] != cs[right - i]) {
                return false;
            }
        }
        return true;
    }
}

或者直接使用 StringBuilder 进行字符串反转

class Solution {
    public boolean isPalindrome(int x) {
        String str = String.valueOf(x);
        StringBuilder sb = new StringBuilder(str);
        sb.reverse();
        return str.equals(sb.toString());
    }
}

进阶实现

如果我们不将数字转换成字符串该怎么办呢?

我们首先想到的是将数字反转,但是这里有一个问题,如果反转之后的数字是一个超出整形范围的数字该怎么办呢?

我们可以只反转数字的一半长度,判断前半部分和后半部分(反转之后)是否一致,随着数字的逐渐遍历,所以回文数字(后半部分)会越来越大,前半部分(原数字)会越来越小,当 后半部分 > 前半部分 的时候,终止!

所以可以将数字分为两种类型:

  1. 输入数字为奇数:中间点是一个单独存在的数字,及不考虑中间点的话,前半部分==后半部分(反转之后),如果考虑中间点的话就是 前半部分==后半部分/10
  2. 输入数字为偶数:中间点在两个部分中间,前半部分==后半部分
class Solution {
    public boolean isPalindrome(int x) {
        // 特殊情况判断:负数和末位是0且不是0(x0、xy0、xyz0)
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        int ans = 0;
        while (x > ans) {
            // 整数反转
            ans = ans * 10 + x % 10;
            x /= 10;
        }
        // 偶数的时候前半部分和后半部分正好相等
        // 奇数的时候后半部分会多一个数字到最后一位,所以去除最后一位在进行比较
        return x == ans || x == ans / 10;
    }
}

引用

我的 github 仓库已经同步建立,点击访问