Bagaimana cara saya memeriksa apakah suatu angka adalah palindrom?
Bahasa apapun. Algoritma apa saja. (kecuali algoritma membuat angka menjadi string dan kemudian membalikkan string).
algorithm
language-agnostic
Esteban Araya
sumber
sumber
number
danis a palindrome
akan berarti dalam konteks ini: bagaimana dengan 13E31 (basis sepuluh)? 01210 (nol di depan)? + 10-10 + 1 (lima digit terner seimbang)?Jawaban:
Ini adalah salah satu masalah Project Euler . Ketika saya menyelesaikannya di Haskell saya melakukan persis apa yang Anda sarankan, ubah nomornya menjadi String. Maka sepele untuk memeriksa bahwa string adalah pallindrome. Jika kinerjanya cukup baik, lalu mengapa repot membuatnya lebih kompleks? Menjadi pallindrome adalah properti leksikal dan bukan matematika.
sumber
to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo
- tidak. Komputasi dalam sistem angka target, dapat menambahkan akan dilakukan (pikirkan bagaimana Anda biasanya mengkonversi dari desimal ke biner - terbiasa berpikir perhitungan berarti biner tidak berarti Anda tidak dapat melakukan, misalnya, aritmatika desimal (dan Anda dapat melakukan konversi dari biner ke desimal tanpa pembagian atau modulo 2)Untuk nomor yang diberikan:
Jika
n == rev
demikiannum
adalah palindrome:sumber
num
setelah pembagian (mengetik lebih longgar), Anda harus membuatnyanum = floor(num / 10)
.Hanya berfungsi untuk bilangan bulat. Tidak jelas dari pernyataan masalah jika angka floating point atau nol terkemuka perlu dipertimbangkan.
sumber
Di atas sebagian besar jawaban yang memiliki masalah sepele adalah bahwa variabel int mungkin meluap.
Lihat http://articles.leetcode.com/palindrome-number/
sumber
sumber
Dorong setiap digit individu ke tumpukan, lalu lepaskan. Jika maju dan mundur sama, itu adalah palindrom.
sumber
Saya tidak melihat jawaban yang memecahkan masalah ini tanpa menggunakan ruang tambahan, yaitu, semua solusi yang saya lihat menggunakan string, atau integer lain untuk membalikkan angka, atau beberapa struktur data lainnya.
Meskipun bahasa seperti Java membungkus integer overflow, perilaku ini tidak terdefinisi dalam bahasa seperti C. ( Coba membalikkan 2147483647 (Integer.MAX_VALUE) di Jawa )
Penyelesaiannya bisa dengan menggunakan panjang atau sesuatu tetapi, secara stylistically, saya tidak cukup seperti pendekatan itu.
Sekarang, konsep bilangan palindromik adalah bilangan tersebut harus membaca maju dan mundur yang sama. Bagus. Dengan menggunakan informasi ini, kita dapat membandingkan digit pertama dan digit terakhir. Triknya, untuk digit pertama, kita perlu urutan nomornya. Katakanlah, 12321. Membagi ini dengan 10.000 akan memberi kita yang pertama. 1. Trailing 1 dapat diambil dengan mengambil mod dengan 10. Sekarang, untuk mengurangi ini ke 232
(12321 % 10000)/10 = (2321)/10 = 232
.. Dan sekarang, 10000 perlu dikurangi dengan faktor 2. Jadi, sekarang ke kode Java ...Diedit sesuai saran Hardik untuk membahas kasus-kasus di mana ada nol dalam jumlah.
sumber
Dalam Python, ada cara yang cepat dan berulang.
Ini juga mencegah masalah memori dengan rekursi (seperti kesalahan StackOverflow di Jawa)
sumber
Cara tercepat yang saya tahu:
sumber
Hanya untuk bersenang-senang, ini juga berfungsi.
sumber
Mengapa mengabaikan solusi itu? Mudah diimplementasikan dan dibaca . Jika Anda ditanya tanpa komputer apakah
2**10-23
palindrom desimal, Anda pasti akan mengujinya dengan menuliskannya dalam desimal.Setidaknya dalam Python, slogan 'operasi string lebih lambat daripada aritmatika' sebenarnya salah. Saya membandingkan algoritma aritmatika Smink dengan pembalikan string sederhana
int(str(i)[::-1])
. Tidak ada perbedaan kecepatan yang signifikan - itu terjadi pembalikan string sedikit lebih cepat.Dalam bahasa yang dikompilasi (C / C ++) slogan mungkin berlaku, tetapi satu risiko meluap kesalahan dengan jumlah besar.
Hasil dalam detik (lebih rendah lebih baik):
sumber
Saya menjawab masalah Euler menggunakan cara yang sangat kasar. Tentu saja, ada algoritma yang jauh lebih cerdas saat saya membuka utas forum terkait yang tidak dikunci. Yaitu, seorang anggota yang pergi dengan pegangan Begoner memiliki pendekatan baru, sehingga saya memutuskan untuk mengimplementasikan kembali solusi saya menggunakan algoritma-nya. Versi-nya menggunakan Python (menggunakan loop bersarang) dan saya menerapkannya kembali di Clojure (menggunakan satu loop / berulang).
Di sini untuk hiburan Anda:
Ada juga jawaban Common Lisp, tetapi tidak dapat saya ungkapkan.
sumber
Berikut adalah versi Skema yang membangun fungsi yang akan bekerja melawan basis apa pun. Ini memiliki pemeriksaan redundansi: mengembalikan false dengan cepat jika nomor tersebut merupakan kelipatan dari basis (berakhir pada 0).
Dan itu tidak membangun kembali seluruh nomor terbalik, hanya setengah.
Itu yang kita butuhkan.
sumber
Solusi rekursif dalam ruby, tanpa mengubah angka menjadi string.
sumber
Versi golang:
sumber
Lepaskan angka pertama dan terakhir dan bandingkan sampai Anda kehabisan. Mungkin ada digit yang tersisa, atau tidak, tetapi bagaimanapun juga, jika semua angka yang muncul cocok, itu adalah palindrom.
sumber
Berikut adalah satu lagi solusi dalam c ++ menggunakan templat. Solusi ini akan berfungsi untuk perbandingan string palindrom case-insensitive.
sumber
metode dengan faktor konstan yang sedikit lebih baik daripada metode @sminks:
sumber
inilah versi # af:
sumber
Angka adalah palindromik jika representasi stringnya adalah palindromik:
sumber
sumber
Untuk memeriksa nomor yang diberikan adalah Palindrome atau tidak (Kode Java)
sumber
Banyak solusi yang diposting di sini membalikkan bilangan bulat dan menyimpannya dalam variabel yang menggunakan ruang ekstra
O(n)
, tetapi di sini adalah solusi denganO(1)
ruang.sumber
Saya selalu menggunakan solusi python ini karena kekompakannya.
sumber
Coba ini:
sumber
Berikut ini adalah daftar solusi usings sebagai tumpukan dalam python:
muncul tumpukan hanya mempertimbangkan sisi paling kanan dari angka untuk perbandingan dan gagal cepat untuk mengurangi cek
sumber
sumber
sumber
sumber
Cara rekursif, tidak terlalu efisien, hanya memberikan opsi
(Kode python)
sumber