هل يمكنني الحصول على بعض الملاحظات على هذه الوظيفة `ispalindrome ()` `في C؟
-
27-09-2019 - |
سؤال
أنا أكتب بعض الوظائف المفيدة في C. واحدة منها isPalindrome()
.
كنت أحسب تحديد ما إذا كان الرقم هو palindrome أم لا ، يجب أن ...
- احصل على جميع الأرقام في صفيف
- تكرار من خلال اثنين من الفهارس - ابدأ واحدة في 0 وواحد إلى عدد الصفيف
- زيادة/انخفاض الفهارس أثناء توصيل الصفيف أثناء مطابقة ، وإذا وصلت عدد الصفيف إلى 0 ، فلدينا palindrome (أي الانتهاء من جميع الأرقام).
خطرت لي...
int isPalindrome(int num) {
int places[100];
int i = 0;
while (num > 0) {
places[i++] = num % 10;
num /= 10;
}
int j = 0;
while (i >= 0 && places[j++] == places[--i]) {
}
return i == -1;
}
هل هذا عمومًا كيف يتم ذلك؟
أنا أتعلم C بمفردي ، وعلى الرغم من أنني أستطيع معرفة متى يجمع الكود الخاص بي ولا يستغرق كل يوم للعمل عيون خبير لأخبرني إذا كنت على المسار الصحيح.
لذلك ، أي تحسينات أو اقتراحات على الكود الخاص بي؟
شكرا جزيلا!
المحلول
عليك فقط أن تحلق أثناء i > j
. مرة واحدة i <= j
, ، أنت فقط تحقق من جميع الأحرف للمرة الثانية.
نصائح أخرى
على الرغم من استخدام مضمّن ++
و --
قد يبدو المشغلون في ما يلي ذكيين:
while (i >= 0 && places[j++] == places[--i]) {
}
سيكون الكود الخاص بك أسهل في القراءة إذا وضعت هؤلاء داخل جسم الحلقة:
while (i >= 0 && places[j] == places[i-1]) {
j++;
i--;
}
وبهذه الطريقة ، لن يضطر قارئ الكود إلى التفكير في الآثار الجانبية المحتملة لتغيير قيم i
و j
ضمن الاختبار الشرطي. من المحتمل ألا يكون هناك تأثير قابل للقياس على سرعة الكود المترجم (على الرغم من أنه إذا كان الأداء مهمًا لهذه الوظيفة ، فيجب عليك التحقق من المترجم الخاص بك).
أيضا ، لديك خطأ حيث ستصل places[-1]
لو i == 0
.
سأستخدم فقط sprintf
إلى "تحويل السلسلة إلى الأرقام":
char places[100];
sprintf(places, "%i", num);
i = strlen(places);
في جافا
static boolean isPalindrome(String p) {
return p.equals(new StringBuilder(p).reverse().toString());
}
في C ++ و C
int IsPalindrome(char *string) {
int bottom = 0, top;
top = strlen(string) - 1;
while(bottom < top && string[bottom] == string[top]) {
++bottom;
--top;
}
return (bottom >= top ? 1:0);
}
ملاحظة ، تحتاج إلى الكتابة itoa وظيفة ، إذا كنت بحاجة إلى القيام بذلك لإدخال رقم. او استعمل ( حلقة الوصل ).
هذا هو ما يتم ذلك بشكل عام. هذا من شأنه أن يعمل أيضا لجميع القواعد وليس فقط 10.