leetcode
leetcode 1 ~ 50
回文数

回文数

难度:

标签:

题目描述

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

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

 

示例 1:

输入:x = 121
输出:true

示例 2:

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

示例 3:

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

 

提示:

  • -231 <= x <= 231 - 1

 

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

代码结果

运行时间: 84 ms, 内存: 13.7 MB


/*
 * 题目思路:
 * 我们使用 Java Stream API 对整数进行处理。
 * 首先,我们将数字转换为字符串,然后将其字符流化,反转流,
 * 然后再将其连接成字符串并与原始字符串进行比较。
 */
import java.util.stream.IntStream;
 
public class PalindromeNumberStream {
    public boolean isPalindrome(int x) {
        String str = String.valueOf(x);
        String reversedStr = IntStream.range(0, str.length())
                                       .mapToObj(i -> str.charAt(str.length() - 1 - i))
                                       .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
                                       .toString();
        return str.equals(reversedStr);
    }
}

解释

方法:

该题解的思路是先判断一些特殊情况,如果x为0则直接返回True;如果x为负数或者x的个位数为0则直接返回False。对于一般情况,创建一个列表a,通过循环取x的个位数添加到列表a中,并将x除以10。最后判断列表a和它的逆序是否相等,相等则说明x是回文数,返回True,否则返回False。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么在判断`x`为负数或者`x`的个位数为0时,可以直接返回`False`?
在数学中,回文数是指正序(从左向右)和倒序(从右向左)读都是一样的数。因此,所有负数都不可能是回文数,因为负号在数的最前面,而在数的最后面不会有负号。至于个位数为0的情况,除了0本身,任何以0结尾的数都不能是回文数,因为这样的数在正序读和倒序读时最后一个数字和第一个数字不会相同(正序读时最后一个数字是0,倒序读时第一个数字是0)。因此,这两种情况都可以直接判定为非回文数,返回`False`。
🦆
为什么在判断列表`a`和它的逆序是否相等时,可以确定`x`是否为回文数?
列表`a`包含了整数`x`的所有数字,按照从最低位到最高位的顺序。当我们取`a`的逆序时,实际上是将数字序列从最高位到最低位排列。如果整数`x`是回文数,那么这两个序列应该是完全相同的。因此,通过比较列表`a`与其逆序是否相等,可以有效地判断整数`x`是否为回文数。这种方法不依赖于将整数转换为字符串,而是直接通过数值操作来完成判断。
🦆
如果不允许将整数转为字符串来解决这个问题,是否有其他方法可以判断一个整数是否为回文数?
是的,有一种方法是通过数学计算来判断一个整数是否为回文数,而不需要将整数转换为字符串。这个方法涉及到反转整数的后半部分,并与前半部分进行比较。具体步骤如下:首先检查负数和以0结尾的数。然后,使用一个变量来存储整数的后半部分的逆序。通过不断将原整数的最后一位加到逆序数的末尾,并将原整数除以10来实现这一点。当原整数小于或等于逆序数时,停止过程。最后,比较原整数与逆序数是否相等(对于偶数位的数字)或者原整数是否等于逆序数除以10(对于奇数位的数字)。这样就可以判断整数是否为回文数而无需使用字符串。

相关问题

回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

 

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

 

提示:

  • 链表中节点数目在范围[1, 105]
  • 0 <= Node.val <= 9

 

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?