回文数程序 Java 使用 while 和 for 循环

⚡ 智能摘要

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

  • 🔁 核心定义: 回文数是指数字颠倒后仍然保持不变的数字,例如 131、393 和 34043。
  • ➗ Reversal 技术: 模运算符 extracts 是最后一位数字,整数除法会将其去除,每次去除一位数字。
  • 🧮 累加器规则: 每次迭代都将累计总和乘以十,然后再加上新加入的总和。trac泰德数字。
  • 🔂 循环选择: 只要每次迭代中除法只出现一次,while 循环和 for 循环就会产生相同的结果。
  • 🔤 字符串方法: StringBuilder 反向比较文本,适用于单词和数字。
  • ⚠️ 边缘情况: 个位数的值总是回文数,负数的值永远不是回文数,末尾的零会破坏数值比较。
  • ⏱️ 复杂性概况: 两种循环版本的运行时间均为 O(log n),与数字位数成正比,并且使用 O(1) 的额外空间。

回文数程序 Java

什么是回文数?

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

边缘情况和方法比较

三个输入会导致简单的实现方式出现问题,因此每个版本在使用前都应该针对这三个输入进行测试。

  1. 负数: 像 -121 这样的值永远不是回文数,因为负号在末尾没有对应的数字。 if (inputNumber < 0) return false;.
  2. 末尾的零: 值 100 反转为 1,因此比较结果正确地返回 false。只有数字 0 本身才能在以零结尾的值中传递。
  3. 整数溢出: 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 字符串 针对基于文本的方法。

常见问题

不。负号只出现在前面,所以 -121 反过来是 121-,这永远不会匹配。添加一个早期保护机制,对于任何小于零的值都返回 false。

乘法运算会将已收集的数字向左移动一位,从而腾出个位给新加入的数字。tracted 数字。这将按相反的顺序重建数字。

反转后的值可能超过整数的最大值 2147483647,并溢出为负数。请将累加器声明为长整型,或者改为将值作为字符串进行比较。

使用 Scanner 和 nextInt 读取值,然后将其传递给相同的反转逻辑。将读取操作放在 try 代码块中,以防止非数字输入导致程序崩溃。

通常情况下,如果被明确要求审查代码,他们会给出肯定的答复。他们很少主动指出代码有问题,所以最好测试一个已知的回文数,例如 121,而不是仅仅相信一个通过的示例。

这个问题旨在考察考生在几行代码中对循环控制、整数运算和边界情况推理的能力。它还能揭示考生在提交代码前是否会对人工智能生成的代码进行验证。

总结一下这篇文章: