Palindrome Number
يكون العدد متناظرًا عندما تُقرأ أرقامه بالطريقة نفسها من اليسار إلى اليمين ومن اليمين إلى اليسار، مثل 1221. إذا كان لديك عدد صحيح x، فأعِد true إذا كان متناظرًا، وfalse خلاف ذلك. لا يُعدّ العدد السالب متناظرًا أبدًا، لأن إشارة الطرح فيه لا يقابلها شيء في الطرف الآخر.
الدالة
- xinteger
- العدد الصحيح المراد التحقق منه، وقد يكون سالبًا
- تُرجعboolean
- صحيح إذا كان x يُقرأ بالطريقة نفسها في كلا الاتجاهين، وخطأ خلاف ذلك
القيود
-231 ≤ x ≤ 231-1- كل عدد سالب يُرجع
false.
أمثلة
- المدخلات
- x = 121
- المخرجات
- true
- الشرح
- عند قراءة العدد بالعكس، يظل 121 هو 121، لذا فالإجابة هي
true.
- المدخلات
- x = -121
- المخرجات
- false
- الشرح
- عند قراءته بالعكس، تصبح
-121هي121-، وهذا نص مختلف، لذا فالإجابة هيfalse.
سؤال إضافي
هل يمكنك حلّها دون تحويل العدد الصحيح إلى سلسلة نصية؟
تلميحات
افتحها واحدًا تلو الآخر. كل تلميح يكشف أكثر قليلًا.
لا يمكن أن تكون الأعداد السالبة متناظرة أبدًا، لذا عالجها أولًا.
خذ الرقم الأخير باستخدام
x % 10واحذفه بالقسمة الصحيحة على10.أنشئ العدد المعكوس باستخدام
reversed = reversed * 10 + digit، ثم قارنه بالعدد الأصلي.
الحل
يكون العدد متناظرًا إذا كان يساوي معكوسه. عند التعامل معه كنص، يكفي إجراء مقارنة واحدة. أما من دون تحويله إلى نص، فقد تؤدي إعادة بناء العدد المعكوس بالكامل إلى تجاوز السعة، لذا اعكس النصف الثاني من الأرقام فقط وقارنه بالنصف الأول.
قارن السلسلة بنسختها المعكوسة
الفكرة
اكتب العدد كنص وقارنه بنسخته المعكوسة. لا تحتاج الأعداد السالبة إلى حالة خاصة: يبدأ -121 بعلامة ناقص وينتهي برقم، لذا لا يساوي أبدًا نسخته المعكوسة 121-.
يحتوي النص على محرف واحد لكل رقم، أي نحو log10(x) منها، وبحد أقصى 11 هنا. والتكلفة هي السلسلة النصية الإضافية.
الخوارزمية
- حوِّل
xإلى سلسلة نصيةs. - اعكس
s. - أعِد ما إذا كانت
sتساوي معكوسها.
def isPalindrome(x):
s = str(x)
# A minus sign sits only at the front, so a negative never matches its reverse.
return s == s[::-1]اعكس نصف العدد
الفكرة
يعطي x % 10 الرقم الأخير، والقسمة الصحيحة على 10 تزيله. إن نقل الأرقام من نهاية x إلى عدد ثانٍ half يُكوِّن معكوس الأرقام التي أزلتها. توقّف عندما يصبح half أكبر من أو يساوي ما تبقّى من x: فهذا يعني أنك أخذت نصف الأرقام. ينتهي 1221 بـ x = 12 وhalf = 12، وهو عدد متناظر. إذا كان عدد الأرقام فرديًا، فسيحتوي half أيضًا على الرقم الأوسط: ينتهي 12321 بـ x = 12 وhalf = 123، لذا تقارن x بـ half / 10.
عالج حالتين قبل الحلقة. العدد السالب لا يكون أبدًا عددًا متناظرًا. والعدد الذي ينتهي بـ 0 يجب أن يبدأ بـ 0، وهذا لا ينطبق إلا على 0؛ ومن دون هذا التحقق، ينتهي 10 بـ x = 0 وhalf = 1، ويمرّ x == half / 10 عن طريق الخطأ. لا يتجاوز half أبدًا 6 أرقام، لذا فهو يتسع في أي نوع صحيح.
الخوارزمية
- إذا كان
xسالبًا، أو ينتهي بـ 0 وليس 0، فأعِدfalse. - عيّن
half = 0. - ما دام
x > half، عيّنhalf = half * 10 + x % 10واقسمxعلى 10 باستخدام القسمة الصحيحة. - أعِد
trueإذا كانx == half(عدد زوجي من الأرقام) أوx == half / 10(عدد فردي من الأرقام).
def isPalindrome(x):
if x < 0:
return False
original, reversed_num = x, 0
while x > 0:
reversed_num = reversed_num * 10 + x % 10
x //= 10
return original == reversed_num
أخطاء شائعة وحالات حدّية
- نسيان الأعداد السالبة. في اللغات التي تحتفظ فيها عملية الباقي بإشارة العدد، فإن عكس
-121يعطي-121وينجح الفحص. في Python، حيث إن-1 // 10يساوي-1، فإن حلقةwhile x != 0لا تنتهي أبدًا. - عدم رفض الأعداد التي تنتهي بـ 0. عندها يقبل عكس النصف العدد
10. والعدد0نفسه متناظر. - عكس العدد كاملًا باستخدام عدد صحيح من 32 بت. معكوس
2147483647لا يتسع ضمن هذا النوع. - استخدام
/عندما تقسم اللغة إلى كسر. استخدمMath.floor(x / 10)في JavaScript، و//في Python، و%/%في R، و~/في Dart. - مقارنة المعكوس الكامل مع
xبعد أن غيّرت الحلقة قيمةx. احتفظ بنسخة من القيمة الأصلية.
أسئلة شائعة3
هل العدد السالب متناظر؟
لا. عند قراءته من الخلف إلى الأمام، يصبح -121 هو 121-، ولا توجد علامة مطابقة لعلامة الطرح في الطرف الآخر. لذا تُرجع كل الأعداد الصحيحة السالبة false.
لماذا نعكس نصف العدد فقط؟
قد يؤدي عكس جميع الأرقام إلى تجاوز سعة عدد صحيح ذي 32 بت: فالعدد المعكوس لـ 2147483647 أكبر من أكبر قيمة لـ int. نصف الأرقام يلائم دائمًا، وتنفّذ الحلقة نصف العمل.
ما هو التعقيد الزمني لمسألة العدد المتناظر؟
يعمل كلا الأسلوبين في زمن O(log x)، لأن العدد x يتكوّن من نحو log10(x) رقمًا، ويُعالَج كل رقم مرة واحدة. يستخدم أسلوب السلسلة النصية مساحة إضافية O(log x) للنص؛ بينما يستخدم أسلوب عكس النصف مساحة O(1).
مسائل مشابهة
مسائل تعتمد على الأفكار نفسها. حلّ اثنتين أو ثلاث منها يثبّت النمط.
def isPalindrome(x):
# اكتب الكود هنااختبار #1
اختبار #2
وسيط
x = 121
الإخراج المتوقع
true