برنامج رقم Palindrome في Java استخدام while & for Loop

⚡ ملخص ذكي

برنامج رقم Palindrome في Java تُحدد هذه الخوارزمية ما إذا كانت القيمة تُقرأ بشكل صحيح من اليمين إلى اليسار ومن اليسار إلى اليمين عن طريق عكس أرقامها. يُقدم هذا المقال الخوارزمية، ونسخة منها باستخدام حلقة while، ونسخة أخرى باستخدام حلقة for، وطريقة تعتمد على السلاسل النصية، بالإضافة إلى الاستدعاء الذاتي، والحالات الحدية، وتحليل التعقيد مع مخرجات مُثبتة.

  • 🔁 التعريف الأساسي: يظل العدد المتناظر دون تغيير بعد عكس أرقامه، كما هو الحال مع 131 و393 و34043.
  • ➗ Revالتقنية العامة: عامل المعامل extracيقوم هذا الإجراء بحذف الرقم الأخير، ثم يقوم القسمة الصحيحة بإزالته، رقم واحد في كل مرة.
  • 🧮 قاعدة التجميع: في كل دورة، يتم ضرب المجموع التراكمي في عشرة قبل إضافة الناتج الجديدtracرقم تيد.
  • 🔂 اختيار المسار: حلقة while وحلقة for تنتجان نتائج متطابقة، بشرط أن يظهر القسمة مرة واحدة بالضبط في كل تكرار.
  • 🔤 طريقة السلسلة النصية: يقوم StringBuilder بمقارنة النصوص بشكل عكسي مباشر ويعمل مع الكلمات والأرقام على حد سواء.
  • ⚠️ الحالات الحدية: القيم المكونة من رقم واحد تكون دائماً متناظرة، أما القيم السالبة فلا تكون كذلك أبداً، والأصفار اللاحقة تكسر المقارنة العددية.
  • ⏱️ ملف تعريف التعقيد: يعمل كلا إصداري الحلقة في وقت O(log n) يتناسب مع عدد الأرقام ويستخدمان مساحة إضافية O(1).

برنامج رقم Palindrome في Java

ما هو العدد المتناظر؟

A رقم متناظر العدد المتناظر هو عدد يبقى كما هو عند عكس ترتيب حروفه. على سبيل المثال، العدد 131. فعند عكس ترتيب أرقامه، يبقى كما هو. يتميز العدد المتناظر بتناظر انعكاسي حول المحور الرأسي. وينطبق المبدأ نفسه على الكلمة التي تبقى بنفس التهجئة عند عكس ترتيب حروفها.

أمثلة على الأعداد المتناظرة في Java

121, 393, 34043, 111, 555, 48084

أمثلة على الكلمات المتناظرة

LOL, MADAM

كل قيمة رقمية من 0 إلى 9 هي قيمة متناظرة بحكم التعريف، لأن عكس رقم واحد ينتج نفس الرقم.

خوارزمية الرقم المتناظر

فيما يلي منطق خوارزمية الأرقام المتناظرة Java:

  • قم بإحضار رقم الإدخال الذي يحتاج إلى التحقق من كونه a الفرعية العكسية.
  • انسخ الرقم إلى متغير مؤقت واعكسه.
  • قارن بين الرقم المعكوس والرقم الأصلي.
  • إذا كانا متطابقين، فإن الرقم هو "رقم متناظر".
  • وإلا فإن الرقم ليس "رقمًا متناظرًا".

عملية الانعكاس نفسها هي الجزء الوحيد الذي يحتاج إلى عناية. عمليتان حسابيتان تقومان بكل العمل، والجدول أدناه traces them for the value 171.

تجاوز أ (العدد المتبقي) آخرDigit = a % 10 المجموع = (المجموع * 10) + الأخيرDigit أ = أ / 10
1 171 1 1 17
2 17 7 17 1
3 1 1 171 0

بعد المرور الأخير، يكون المجموع 171، وهو ما يساوي المدخلات الأصلية، لذلك تم تأكيد أن الرقم هو عدد متناظر.

كيفية التحقق مما إذا كان رقم الإدخال هو Palindrome أم لا

فيما يلي برنامج للكلمات المتناظرة 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

برنامج للتحقق من Palindrome باستخدام حلقة

وفيما يلي Java برنامج لقراءة وقراءة الكلمات المتناظرة باستخدام حلقة تكرارية (for loop). يحتوي رأس البرنامج على اختبار الخروج وعملية القسمة، لذا يجب ألا يقوم جسم الحلقة بالقسمة مرة أخرى.

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 بشكل غير صحيح على أنه ليس عددًا متناظرًا.

برنامج Palindrome في 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

برنامج Palindrome في 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، لذا فإن المقارنة تُرجع خطأً بشكل صحيح. الرقم 0 وحده هو الذي يمر بين القيم التي تنتهي بصفر.
  3. تجاوز سعة العدد الصحيح: Revقد يؤدي إدخال قيمة عددية كبيرة مثل 1,999,999,999 إلى تجاوز نطاق الأعداد الصحيحة. لذا، يُنصح بتعريف المتغير sum كعدد صحيح طويل (long) عندما تقترب القيمة المدخلة من الحد الأقصى.

يقارن الجدول أدناه بين الأساليب الأربعة الموضحة في هذه الصفحة.

الأسلوب تعقيد الوقت تعقيد الفضاء أعمال للكلمات ملاحظة
حائط اللوب O (تسجيل ن) يا (1) لا أوضح مثال على عكس الأرقام
لحلقة O (تسجيل ن) يا (1) لا منطق متطابق، تقسيم في العنوان فقط
عكس StringBuilder O (ن) O (ن) نعم أقصر كود، يُخصص سلسلة نصية جديدة
العودية O (ن) مكدس O(n) نعم مفيد لمناقشات المقابلات حول التكرار

الرقم extracيتكرر نمط tion المستخدم هنا في العديد من التمارين. تابع مع متسلسلة فيبوناتشي Javaأطلقت حملة Java برنامج للتحقق من الأعداد الأولية، و Bubblه خوارزمية الفرز في Javaأما بالنسبة لصيغة الحلقة نفسها، فراجع لكل حلقة في Java وعلى نطاق أوسع Java البرنامج التعليمي، ونرى Java سلاسل بالنسبة للطريقة القائمة على النصوص.

الأسئلة الشائعة

لا. تظهر علامة السالب في البداية فقط، لذا فإن -121 معكوسة تصبح 121-، وهو عدد لا يتطابق أبدًا. أضف شرطًا مبكرًا يُرجع القيمة "خطأ" لأي قيمة أقل من الصفر.

تؤدي عملية الضرب إلى تحريك الأرقام التي تم جمعها بالفعل خانة واحدة إلى اليسار، مما يحرر خانة الآحاد للرقم الجديد المحذوفtracرقم تيد. هذا يعيد بناء الرقم بترتيب عكسي.

قد تتجاوز القيمة المعكوسة الحد الأقصى لعدد الأعداد الصحيحة (2147483647) وتتحول إلى قيمة سالبة. لذا، يُنصح بتعريف المُجمِّع كعدد صحيح طويل (long)، أو مقارنة القيم كسلاسل نصية.

اقرأ القيمة باستخدام Scanner و nextInt، ثم مررها إلى نفس منطق الانعكاس. ضع عملية القراءة داخل كتلة try حتى لا يتسبب إدخال بيانات غير رقمية في تعطل البرنامج.

عادةً ما تكون الإجابة بنعم عند طلب مراجعة الكود بشكلٍ صريح. نادرًا ما يُشيرون إلى وجود خطأ من تلقاء أنفسهم، لذا يُنصح دائمًا باختبار سلسلة متناظرة معروفة مثل 121 بدلاً من الاعتماد على مثال ناجح.

يختبر هذا السؤال التحكم في الحلقات، والحسابات الصحيحة، والاستدلال في الحالات الحدية في بضعة أسطر. كما يكشف ما إذا كان المرشح يتحقق من صحة الكود المُولّد بواسطة الذكاء الاصطناعي قبل تقديمه.

تلخيص هذه التدوينة بـ: