
本文详解 java 中判断整数是否为回文数的两种可靠方法:数值反转法(修复原代码逻辑错误)和字符串双指针法,并提供可直接运行的完整示例与关键注意事项。
本文详解 java 中判断整数是否为回文数的两种可靠方法:数值反转法(修复原代码逻辑错误)和字符串双指针法,并提供可直接运行的完整示例与关键注意事项。
在 Java 中判断一个整数是否为回文数(即正读反读都相同的数字,如 121、1331、7),常见思路有数值反转和字符串比对两种。但初学者常因变量误用导致逻辑错误——正如提问中的代码:它在循环中修改了 n,却用未重置的 n 参与取余运算,造成 remainder 计算完全错误。
✅ 正确的数值反转法(修复版)
核心问题在于:原代码用 temp % 10 计算余数,却在 while 循环中持续修改的是 n(而非 temp),而 temp 始终未变,导致每次取余都是同一数字,反转结果必然错误。正确做法是全程操作 n,并提前保存原始值:
public static void palindromeNo(int n) {
int original = n; // 保存原始输入
int reverse = 0;
// 安全处理负数:负数不可能是回文数(含符号)
if (n < 0) {
System.out.println("this is not a palindrome number");
return;
}
while (n > 0) {
int remainder = n % 10; // ✅ 正确:对当前 n 取余
reverse = reverse * 10 + remainder;
n = n / 10; // ✅ 更新 n,推进下一位
}
if (reverse == original) {
System.out.println("this is a palindrome number");
} else {
System.out.println("this is not a palindrome number");
}
}⚠️ 注意:该方法不适用于末尾含 0 的正数(如
120),因为反转后变为21,但120 != 21—— 这本身符合数学定义(120 不是回文数),无需额外处理;但需注意0本身是回文数,上述代码可正确处理。
✅ 推荐的字符串双指针法(简洁、鲁棒、易读)
将数字转为字符串后,用双指针从首尾向中间比对字符,时间复杂度 O(n/2),逻辑清晰且天然规避整数溢出与边界计算问题:
立即学习“Java免费学习笔记(深入)”;
public static boolean isPalindrome(int num) {
if (num < 0) return false; // 负数非回文
String s = String.valueOf(num);
int left = 0, right = s.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
// 测试入口
public static void main(String[] args) {
int test = 121;
if (isPalindrome(test)) {
System.out.println("this is a palindrome number");
} else {
System.out.println("this is not a palindrome number");
}
// 输出:this is a palindrome number
}? 补充说明与最佳实践
-
性能对比:数值反转法空间 O(1),但需小心溢出(虽本题
int范围内反转一般安全);字符串法空间 O(d)(d 为位数),但代码更健壮、可读性高,推荐日常使用。 -
边界测试建议:务必验证
0、7、10、121、1331、-121、100等用例。 -
扩展提示:若需支持大整数,可直接使用
BigInteger或坚持字符串方案,避免long溢出风险。
两种方法均能准确识别回文数。选择取决于场景需求:追求极致空间效率且输入可控 → 用修复后的数值法;强调可维护性与健壮性 → 首选字符串双指针法。


















