Java 中的回文程序

2025 年 7 月 14 日 | 阅读 9 分钟

回文是指一个单词、短语、数字或序列,在忽略空格、标点符号和某些情况下的字母大小写后,正读和反读都相同。

回文示例

  • 单词: radar、level、madam、racecar、civic、refer 等。
  • 短语: a man, a plan, a canal, Panama、never odd or even、No lemon, no melon 等。
  • 数字: 12321、121、3003、999 等。

查找回文的步骤

请按照以下步骤检查字符串是否是回文。

输入: 首先,我们需要从用户那里获取输入,无论是我们想检查回文属性的字符串还是数字。

反转输入: 接下来,我们反转输入的字符串或数字。这可以通过各种技术完成,例如遍历字符或使用内置函数。

比较: 反转输入后,我们将其与输入进行比较。如果两个字符串相同,则给定的输入是回文;否则不是。

输出: 最后,我们将结果显示给用户。

查找回文的方法

我们可以使用以下任何一种方法来检查字符串或单词是否是回文。

  1. 使用迭代
  2. 使用递归
  3. 使用 StringBuilder 类
  4. 使用 for 循环和 charAt() 方法
  5. 使用 String.toCharArray() 方法
  6. 使用堆栈

使用迭代

在此方法中,我们将使用循环将数字分解为单个数字,然后以相反的顺序重新组合它们。我们将使用模运算符提取数字,并使用除法运算符缩短数字。最后,我们将比较反转的数字是否与原始数字匹配。

对于给定的数字,我们执行以下操作

  1. 运行一个 while 循环,直到条件 temp 变量不为 0。
    1. 使用模运算符 (%) 提取数字
    2. 使用公式 reverse = reverse * 10 + last digit,我们将不断更新 reverse 变量。
    3. 我们将使用除法运算符缩短数字
  2. 检查反转的数字是否与原始数字匹配。
  3. 如果匹配,打印 Palindrome,否则打印 Not。

让我们在 Java 中实现上述方法。

示例

编译并运行

输出

Palindrome Number

说明

Java 程序检查给定数字 (n) 是否是回文。它反转数字并将其与原始数字进行比较。如果它们相同,则打印“Palindrome Number”;否则,打印“Not a Palindrome Number”。

使用递归

在此方法中,我们将使用递归将数字分解为单个数字,然后以相反的顺序重新组合它们。最后,我们将检查反转的数字是否与原始数字匹配。

对于给定的数字,我们执行以下操作

  1. 定义一个以数字作为参数的递归函数。
    1. 将基线条件设置为 number ==0。
    2. 将递归步调用设置为 getReverse(num/10, rev)。
  2. 检查返回的值是否与原始数字匹配。
  3. 如果匹配,打印 Palindrome,否则打印 Not。

让我们在 Java 中实现上述方法。

示例

编译并运行

输出

12021 is a Palindrome

使用 StringBuilder 类

我们还可以使用 StringBuilder 类来检查给定的数字或字符串是否是回文。

示例

编译并运行

输出

true
true
true
false

说明

在上面的 Java 程序中,我们定义了一个 isPalindrome() 函数来检查字符串是否是回文。在此函数中,首先反转字符串,然后将结果字符串转换为字符串。然后,使用 String.equals() 方法将反转的字符串与原始字符串进行比较。

使用 for 循环和 charAt() 方法

我们还可以使用一种方法,其中数字或字符串不是预定义的。在这里,用户必须输入数字或字符串来检查数字/字符串是否是回文。

示例

编译并运行

输出

The string is a palindrome.

说明

在上面的程序中,我们定义了一个字符串“level”来检查字符串是否是回文。我们需要找到给定字符串的长度,并将其存储在名为 length 的变量中。for 循环遍历字符串的每个字符并创建字符串的反转。在 if 语句中,我们将原始字符串与反转的字符串进行比较。如果两者相同,则给定的字符串是回文;否则不是。

使用 String.toCharArray() 方法

这是检查字符串是否是回文的另一种方法。

示例

编译并运行

输出

true
false

说明

在上面的 Java 程序中,我们定义了一个布尔函数 isPalindrome() 来检查给定的字符串或数字是否是回文。在此函数中,我们传递了一个字符串并将其转换为小写。之后,字符串被转换为字符数组。在该函数中,我们定义了两个整型变量 i 和 j。变量 i 从开头遍历数组,变量 j 从末尾遍历数组。在 while 循环内,我们比较变量 i 和 j。如果变量 i 和 j 不相等,则返回 false。一旦 char 数组比较完每个字符,isPalindrome() 函数将相应地返回 true 或 false。

使用堆栈

这是检查字符串是否是回文的更复杂的方法。

示例

编译并运行

输出

true
true
true

说明

在上面的程序中,我们定义了一个名为 isPalindrome() 的函数。我们传递了一个字符串作为参数。与前一种方法一样,我们将字符串转换为字符数组。之后,我们创建了一个堆栈,并将字符数组推入其中。在下一步中,我们确定了堆栈的长度,并使用 for 循环逐个弹出数组的字符。弹出的字符存储在一个名为 reversed 的变量中。最后,将反转的字符串与原始字符串进行比较。如果两者相等,则函数返回 true,否则返回 false。

使用 Java 8 Stream

Java 8 引入了 Stream,它提供了一种处理序列的函数式编程方法。我们可以使用 IntStream 来比较字符串两端的字符。

示例

编译并运行

输出

true
true
false

说明

此方法使用 IntStream.range() 从字符串的开头迭代到中间。它使用 allMatch() 方法比较两端的字符。如果所有字符都匹配,则为回文。

要记住的重要事项

  1. 回文定义: 回文是指从前向后读或从后向前读都拼写相同的词,例如“radar”、“121”和“madam”。
  2. 区分大小写: 为避免任何与大小写相关的错误,请始终将字符串转换为小写。
  3. 忽略非字母数字字符(用于句子): 在处理句子或短语时,请删除或忽略标点符号和空格,以准确检查回文。
  4. 效率提示: 对于大型数据集,请使用双指针迭代方法,因为它既有时间和内存效率。
  5. 时间复杂度: 大多数方法(迭代、双指针等)都以线性时间运行:O(n),其中 n 是字符串的长度。

结论

在本节中,我们探讨了回文的概念以及如何在 Java 中创建回文程序。回文检查是一个简单而有趣的问题,它有助于初学者理解像 Java 这样的编程语言中的字符串操作和基本控制流。

Java 中的回文程序选择题

1. 以下哪个 Java 方法可以有效地检查给定字符串是否是回文?

  1. 使用正则表达式
  2. 使用 StringBuilder
  3. 使用递归函数
  4. 使用双指针的迭代方法
 

答案:D

解释: 使用双指针的迭代方法通过比较字符串两端的字符向中心移动,从而有效地检查给定字符串是否是回文。


2. 检查字符串是否为回文的迭代方法的时间复杂度是多少?

  1. O(n)
  2. O(log n)
  3. O(n^2)
  4. O(1)
 

答案:A

解释: 检查字符串是否为回文的迭代方法会遍历字符串一次,比较两端的字符,从而产生线性时间复杂度 O(n)。


3. 以下哪个陈述最能描述处理带有空格和标点符号的短语或句子的回文检测方法?

  1. 在检查回文之前删除所有空格和标点符号。
  2. 在检查回文时忽略空格和标点符号。
  3. 在检查回文之前将空格和标点符号转换为特殊字符。
  4. 将空格和标点符号视为回文检查字符序列的一部分。
 

答案:B

解释: 为了处理带有空格和标点符号的短语或句子,最好在检查回文时忽略这些字符,以便仅关注字母数字字符。


4. 哪个 Java 方法可以有效地从字符串中删除所有非字母数字字符?

  1. replace() 方法
  2. 正则表达式
  3. StringTokenizer 类
  4. StringBuilder 类方法
 

答案:B

解释: 正则表达式提供了一种强大而有效的方法,可以使用模式匹配从字符串中删除所有非字母数字字符。


5. 使用递归方法检查字符串是否为回文的主要优点是什么?

  1. 它比迭代方法具有更好的时间复杂度。
  2. 它比迭代方法消耗的内存更少。
  3. 它提供了更直接的实现。
  4. 它能更有效地处理带有空格和标点符号的字符串。
 

答案:C

解释: 虽然递归方法在时间和内存方面不一定更有效,但它通常为某些问题(包括回文检测)提供了更直接的实现。


下一个主题Java 程序