回文数程序 Java 使用 while 和 for 循环
⚡ 智能摘要
回文数程序 Java 通过反转数值中的数字来判断正读反读是否相同。本文介绍了该算法,并提供了 while 循环版本、for 循环版本、基于字符串的方法、递归、边界情况以及复杂度分析,并给出了验证后的输出结果。

什么是回文数?
A 回文数 回文数是指数字颠倒后仍然保持不变的数字。例如,131。当它的各位数字颠倒过来时,它仍然是同一个数字。回文数具有关于纵轴的对称性。同样的道理也适用于字母颠倒后拼写仍然相同的单词。
回文数的例子 Java
121, 393, 34043, 111, 555, 48084
回文词示例
LOL, MADAM
根据定义,从 0 到 9 的每一个数字都是回文数,因为反转其中一个数字得到的仍然是同一个数字。
回文数算法
以下是回文数算法的逻辑 Java:
- 获取需要检查的输入数字 回文.
- 将该数字复制到临时变量中并反转它。
- 比较反转后的数字和原数字。
- 如果它们相同,则该数字为“回文数”。
- 否则,该数字就不是“回文数”。
唯一需要注意的是逆运算本身。所有工作都由两次算术运算完成,如下表所示。 trac将它们的值设为 171。
| 通过 | (剩余数字) | 最后Digit = a % 10 | 总和 = (总和 * 10) + 最后一个Digit | a = a / 10 |
|---|---|---|---|---|
| 1 | 171 | 1 | 1 | 17 |
| 2 | 17 | 7 | 17 | 1 |
| 3 | 1 | 1 | 171 | 0 |
经过最后一次迭代后,总和为 171,与原始输入相等,因此确认该数字是回文数。
如何检查输入的数字是否是回文
以下是一个回文程序 Java 使用 WHILE 循环。循环会一直持续到数字剩余为止,打印语句会显示每次循环中每个变量的状态。
package com.guru99; public class PalindromeNum { public static void main(String[] args) { int lastDigit, sum = 0, a; int inputNumber = 171; //It is the number to be checked for palindrome a = inputNumber; // Code to reverse a number while(a > 0) { System.out.println("Input Number " + a); lastDigit = a % 10; //getting remainder System.out.println("Last Digit " + lastDigit); System.out.println("Digit " + lastDigit + " was added to sum " + (sum * 10)); sum = (sum * 10) + lastDigit; a = a / 10; } // if the given number equals sum then the number is a palindrome, otherwise not if(sum == inputNumber) System.out.println("Number is palindrome "); else System.out.println("Number is not palindrome"); } }
Code 输出:
Input Number 171 Last Digit 1 Digit 1 was added to sum 0 Input Number 17 Last Digit 7 Digit 7 was added to sum 10 Input Number 1 Last Digit 1 Digit 1 was added to sum 170 Number is palindrome
使用 for 循环检查回文的程序
下面是一个 Java 使用 for 循环编写回文程序。循环头包含退出测试和除法运算,因此循环体中不能再次进行除法运算。
package com.guru99; public class PalindromeNumForLoop { public static void main(String[] args) { int lastDigit, sum = 0, a; int inputNumber = 185; //It is the number to be checked for palindrome a = inputNumber; // Code to reverse a number for( ; a != 0; a /= 10 ) { System.out.println("Input Number " + a); lastDigit = a % 10; //getting remainder System.out.println("Last Digit " + lastDigit); System.out.println("Digit " + lastDigit + " was added to sum " + (sum * 10)); sum = (sum * 10) + lastDigit; } // if the given number equals sum then the number is a palindrome, otherwise not if(sum == inputNumber) System.out.println("Number is palindrome "); else System.out.println("Number is not palindrome"); } }
Code 输出:
Input Number 185 Last Digit 5 Digit 5 was added to sum 0 Input Number 18 Last Digit 8 Digit 8 was added to sum 50 Input Number 1 Last Digit 1 Digit 1 was added to sum 580 Number is not palindrome
⚠️警告: 一个常见的错误是保留 a = a / 10; 在 for 循环体内部,而头部已经包含 a /= 10然后,每次遍历该数字两次,跳过一半的数字,像 121 这样的真正回文数会被错误地报告为非回文数。
回文程序 Java 使用字符串 Reverse
将值转换为文本后,StringBuilder 可以一次性将其反转。同样的方法也适用于单词,而数值方法无法处理单词。
package com.guru99; public class PalindromeString { public static boolean isPalindrome(String text) { // ignore case so MADAM and madam behave identically String clean = text.toLowerCase(); String reversed = new StringBuilder(clean).reverse().toString(); return clean.equals(reversed); } public static void main(String[] args) { System.out.println(isPalindrome("121")); System.out.println(isPalindrome("MADAM")); System.out.println(isPalindrome("Java")); } }
Code 输出:
true true false
回文程序 Java 使用递归
递归会比较最外层的一对字符,然后对逐渐缩小的中间部分调用自身。当剩余字符少于两个时,该方法停止。
package com.guru99; public class PalindromeRecursion { public static boolean isPalindrome(String text, int left, int right) { // base case: pointers met or crossed if (left >= right) { return true; } if (text.charAt(left) != text.charAt(right)) { return false; } return isPalindrome(text, left + 1, right - 1); } public static void main(String[] args) { String value = "34043"; System.out.println(value + " is palindrome: " + isPalindrome(value, 0, value.length() - 1)); String other = "12345"; System.out.println(other + " is palindrome: " + isPalindrome(other, 0, other.length() - 1)); } }
Code 输出:
34043 is palindrome: true 12345 is palindrome: false
边缘情况和方法比较
三个输入会导致简单的实现方式出现问题,因此每个版本在使用前都应该针对这三个输入进行测试。
- 负数: 像 -121 这样的值永远不是回文数,因为负号在末尾没有对应的数字。
if (inputNumber < 0) return false;. - 末尾的零: 值 100 反转为 1,因此比较结果正确地返回 false。只有数字 0 本身才能在以零结尾的值中传递。
- 整数溢出: Rev输入像 1,999,999,999 这样的大整数可能会超出 int 类型的范围。当输入值可能接近该限制时,请将 sum 声明为 long 类型。
下表对比了本页所示的四种方法。
| 付款方式 | 时间复杂度 | 空间复杂度 | 文字作品 | 笔记 |
|---|---|---|---|---|
| While循环 | O(log n) | O(1) | 没有 | 数字反转最清晰的演示 |
| 对于循环 | O(log n) | O(1) | 没有 | 逻辑相同,仅在标题中进行划分。 |
| StringBuilder 反向 | O(N) | O(N) | 是 | 最短代码,分配一个新字符串 |
| 递归 | O(N) | O(n) 堆栈 | 是 | 对面试中关于递归的讨论很有帮助 |
数字 extrac这里使用的模式在许多练习中都会重复出现。继续进行…… 斐波那契数列 Java, Java 检查质数的程序,并 Bubbl排序算法 Java至于循环语法本身,请复习以下内容。 对于每个循环 Java 而且更广泛 Java 教程,并看到 Java 字符串 针对基于文本的方法。
