โปรแกรมเลขพาลินโดรม Java การใช้ while & for Loop

⚡ สรุปอย่างชาญฉลาด

โปรแกรมเลขพาลินโดรม Java อัลกอริทึมนี้ตรวจสอบว่าค่าหนึ่งๆ อ่านได้เหมือนกันทั้งจากหน้าไปหลังและจากหลังไปหน้าหรือไม่ โดยการสลับตัวเลข บทความนี้จะนำเสนออัลกอริทึม เวอร์ชันที่ใช้ลูป while เวอร์ชันที่ใช้ลูป for วิธีการที่ใช้สตริง การเรียกซ้ำ กรณีพิเศษ และการวิเคราะห์ความซับซ้อน พร้อมผลลัพธ์ที่ได้รับการตรวจสอบแล้ว

  • 🔁 คำจำกัดความหลัก: เลขพาลินโดรมคือเลขที่ไม่เปลี่ยนแปลงหลังจากสลับตัวเลข เช่น 131, 393 และ 34043
  • Revเทคนิคทั่วไป: ตัวดำเนินการโมดูลัส extracตัวเลขหลักสุดท้ายจะถูกลบออกโดยการหารจำนวนเต็ม โดยลบทีละหลัก
  • 🧮 กฎการสะสม: แต่ละรอบจะคูณผลรวมที่สะสมไว้ด้วยสิบก่อนที่จะบวกกับค่าที่คำนวณใหม่tracตัวเลขเท็ด
  • 🔂 ตัวเลือกการวนซ้ำ: ลูป while และลูป for ให้ผลลัพธ์ที่เหมือนกัน หากการหารปรากฏเพียงครั้งเดียวในแต่ละรอบการวนซ้ำ
  • 🔤 วิธีการสตริง: StringBuilder reverse เปรียบเทียบข้อความโดยตรงและใช้งานได้ทั้งกับคำและตัวเลข
  • ⚠️ เคสขอบ: ตัวเลขหลักเดียวจะเป็นพาลินโดรมเสมอ ส่วนตัวเลขติดลบจะไม่เป็นพาลินโดรม และเลขศูนย์ต่อท้ายจะทำให้การเปรียบเทียบตัวเลขไม่ถูกต้อง
  • ⏱️ ลักษณะความซับซ้อน: ลูปทั้งสองเวอร์ชันทำงานในเวลา O(log n) ซึ่งเป็นสัดส่วนกับจำนวนหลัก และใช้พื้นที่เพิ่มเติม O(1)

โปรแกรมเลขพาลินโดรม Java

เลขพาลินโดรมคืออะไร?

A หมายเลขพาลินโดรม จำนวนพาลินโดรม คือจำนวนที่ยังคงเป็นจำนวนเดิมเมื่อสลับตำแหน่งตัวเลข ตัวอย่างเช่น 131 เมื่อสลับตัวเลขแล้วก็ยังคงเป็นจำนวนเดิม จำนวนพาลินโดรมมีสมมาตรแบบสะท้อนที่แกนตั้ง แนวคิดเดียวกันนี้ใช้ได้กับคำที่ยังคงสะกดเหมือนเดิมเมื่อสลับตัวอักษร

ตัวอย่างของเลขพาลินโดรมใน Java

121, 393, 34043, 111, 555, 48084

ตัวอย่างคำพาลินโดรม

LOL, MADAM

ตามนิยามแล้ว ตัวเลขทุกตัวตั้งแต่ 0 ถึง 9 เป็นพาลินโดรม เพราะเมื่อสลับตัวเลขหนึ่งตัวแล้วจะได้ตัวเลขเดิม

อัลกอริทึมจำนวนพาลินโดรม

ด้านล่างนี้คือตรรกะของอัลกอริทึมหาเลขพาลินโดรม Java:

  • รับหมายเลขอินพุตที่ต้องตรวจสอบว่าเป็น a ประโยค.
  • คัดลอกตัวเลขลงในตัวแปรชั่วคราว แล้วกลับตัวเลขนั้น
  • เปรียบเทียบเลขกลับตัวกับเลขเดิม
  • ถ้าตัวเลขทั้งสองเหมือนกัน ตัวเลขนั้นเรียกว่า “เลขพาลินโดรม”
  • มิเช่นนั้น ตัวเลขนั้นจะไม่ใช่ “เลขพาลินโดรม”

ส่วนที่ต้องระมัดระวังที่สุดคือการกลับค่า การคำนวณทั้งหมดทำโดยใช้เพียงสองวิธีทางคณิตศาสตร์ และตารางด้านล่าง traces ให้กับพวกเขาด้วยค่า 171

ส่ง a (จำนวนที่เหลือ) ล่าสุดDigit = a % 10 ผลรวม = (ผลรวม * 10) + สุดท้ายDigit a = a / 10
1 171 1 1 17
2 17 7 17 1
3 1 1 171 0

หลังจากผ่านขั้นตอนสุดท้าย ผลรวมมีค่าเท่ากับ 171 ซึ่งเท่ากับค่าที่ป้อนเข้ามาในตอนแรก ดังนั้นจึงยืนยันได้ว่าตัวเลขนั้นเป็นพาลินโดรม

วิธีตรวจสอบว่าหมายเลขอินพุตเป็น Palindrome หรือไม่

ด้านล่างนี้คือโปรแกรมตรวจสอบคำพาลินโดรมในภาษา Java โดยใช้ลูป WHILE ลูปจะทำงานต่อไปเรื่อยๆ ตราบใดที่ยังมีตัวเลขเหลืออยู่ และคำสั่ง print จะแสดงสถานะของตัวแปรแต่ละตัวในแต่ละรอบการทำงาน

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 Output:

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

โปรแกรมตรวจสอบ Palindrome โดยใช้ for loop

ด้านล่างคือ 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 Output:

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 Output:

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 Output:

34043 is palindrome: true
12345 is palindrome: false

กรณีพิเศษและการเปรียบเทียบวิธีการ

อินพุตสามตัวจะทำให้การใช้งานแบบง่ายๆ ล้มเหลว ดังนั้นทุกเวอร์ชันควรได้รับการทดสอบกับอินพุตเหล่านั้นก่อนใช้งาน

  1. ตัวเลขติดลบ: ค่าต่างๆ เช่น -121 ไม่ใช่พาลินโดรม เพราะเครื่องหมายลบไม่มีตัวตรงข้ามที่ท้ายสุด ระวังด้วย if (inputNumber < 0) return false;.
  2. เลขศูนย์ต่อท้าย: ค่า 100 กลับกลายเป็น 1 ดังนั้นการเปรียบเทียบจึงได้ผลลัพธ์เป็นเท็จอย่างถูกต้อง มีเพียงเลข 0 เท่านั้นที่ผ่านเกณฑ์ในกลุ่มค่าที่ลงท้ายด้วยศูนย์
  3. ค่าจำนวนเต็มเกินขีดจำกัด: Revการส่งค่าจำนวนเต็มขนาดใหญ่ เช่น 1,999,999,999 อาจเกินขอบเขตของจำนวนเต็ม ดังนั้นควรประกาศตัวแปร sum เป็น long เมื่อค่าที่ป้อนเข้ามาอาจเข้าใกล้ขีดจำกัด

ตารางด้านล่างนี้เปรียบเทียบวิธีการทั้งสี่วิธีที่แสดงในหน้านี้

วิธี ความซับซ้อนของเวลา ความซับซ้อนของอวกาศ ใช้งานได้สำหรับคำต่างๆ หมายเหตุ :
ในขณะที่วนซ้ำ O (บันทึก n) O (1) ไม่ ตัวอย่างที่ชัดเจนที่สุดของการสลับตัวเลข
สำหรับห่วง O (บันทึก n) O (1) ไม่ ตรรกะเหมือนกัน เพียงแต่แบ่งเฉพาะส่วนหัวเท่านั้น
ตัวสร้างสตริงแบบย้อนกลับ O (n) O (n) มี (ใบกำกับภาษีเต็มรูปแบบ) โค้ดที่สั้นที่สุด สร้างสตริงใหม่
Recursion O (n) สแต็ก O(n) มี (ใบกำกับภาษีเต็มรูปแบบ) มีประโยชน์สำหรับการสนทนาสัมภาษณ์เกี่ยวกับเรื่องการเรียกซ้ำ

ตัวเลข extracรูปแบบที่ใช้ในที่นี้จะปรากฏขึ้นอีกครั้งในแบบฝึกหัดหลายๆ ข้อ ดำเนินการต่อด้วย ลำดับฟิโบนาชี่ใน Javaที่ Java โปรแกรมตรวจสอบจำนวนเฉพาะและ Bubble เรียงลำดับอัลกอริทึมใน Javaสำหรับไวยากรณ์ของลูป โปรดดูที่... สำหรับแต่ละลูปใน Java และกว้างขึ้น Java เกี่ยวกับการสอนและดู Java เงื่อนไข สำหรับวิธีการที่ใช้ข้อความเป็นหลัก

คำถามที่พบบ่อย

ไม่ เครื่องหมายลบจะปรากฏเฉพาะด้านหน้าเท่านั้น ดังนั้น -121 เมื่อกลับด้านจะได้เป็น 121- ซึ่งไม่มีทางตรงกัน ควรเพิ่มเงื่อนไขตรวจสอบเบื้องต้นที่ส่งค่าเท็จสำหรับค่าใดๆ ที่ต่ำกว่าศูนย์

การคูณจะเลื่อนตัวเลขที่สะสมไว้แล้วไปทางซ้ายหนึ่งตำแหน่ง ซึ่งจะทำให้ตำแหน่งหลักหน่วยว่างสำหรับตัวเลขใหม่tracตัวเลข ted digit นี้จะสร้างตัวเลขขึ้นใหม่ในลำดับย้อนกลับ

ค่าที่กลับด้านอาจเกินค่าสูงสุดของจำนวนเต็ม (int) คือ 2147483647 และอาจกลายเป็นค่าลบได้ ควรประกาศตัวสะสมเป็นชนิดข้อมูล long หรือเปรียบเทียบค่าเป็นสตริงแทน

อ่านค่าด้วย Scanner และ nextInt จากนั้นส่งค่าไปยังตรรกะการกลับค่าเดียวกัน ห่อการอ่านด้วยบล็อก try เพื่อป้องกันไม่ให้โปรแกรมหยุดทำงานหากรับข้อมูลที่ไม่ใช่ตัวเลข

โดยปกติแล้วพวกเขาจะตอบว่าใช่ เมื่อถูกขอให้ตรวจสอบโค้ดอย่างชัดเจน พวกเขาไม่ค่อยตรวจพบข้อผิดพลาดโดยไม่ได้รับการร้องขอ ดังนั้นควรทดสอบด้วยคำที่อ่านได้เหมือนกันทั้งหน้าและหลัง เช่น 121 แทนที่จะเชื่อตัวอย่างที่ยกมาโดยบังเอิญ

คำถามนี้ทดสอบการควบคุมลูป การคำนวณเลขจำนวนเต็ม และการใช้เหตุผลในกรณีพิเศษ โดยใช้โค้ดเพียงไม่กี่บรรทัด นอกจากนี้ยังแสดงให้เห็นว่าผู้สมัครตรวจสอบโค้ดที่สร้างโดย AI ก่อนส่งหรือไม่

สรุปโพสต์นี้ด้วย: