Saya telah diberi masalah berikut dalam sebuah wawancara (yang telah saya gagal pecahkan, tidak mencoba menipu jalan saya sebelumnya): Permainan dimulai dengan bilangan bulat positif . (Mis. A 0 = 1234. ) Angka ini dikonversi ke representasi biner, dan N adalah jumlah bit yang ditetapkan ke 1 . (Mis. A 0 = b 100 1101 0010 , N = 5. )
Pemain 1 memilih nomor lebih kecil dari A 0 . B 0 harus hanya memiliki satu bit yang diatur ke 1. (Misalnya B 0 = b 10 0000 0000 = 512. ) Misalkan A 1 = A 0 - B 0 . (Mis. A 1 = 1234 - 512 = 722 = b 10 1101 0010. ) Suatu perpindahan valid jika B 0memenuhi kendala sebelumnya, dan jika jumlah bit di dalam masih sama dengan N .
Pemain 2 melanjutkan dari dengan memilih B 1 yang valid , kemudian pemain 1 melanjutkan dari A 2 , dan seterusnya. Seorang pemain kalah jika mereka tidak memiliki gerakan sah yang tersisa.
Dengan asumsi kedua pemain bermain secara optimal, tentukan pemain yang menang menggunakan metode yang cukup efisien. (Dalam definisi masalah saya, kendala pada hal ini adalah bahwa program harus dapat memberikan solusi untuk beberapa juta angka input yang masuk ke dalam bilangan bulat 32-bit yang sudah ditandatangani). Artinya, solusi tidak perlu sepenuhnya analitis.
Minat pribadi saya di sini adalah mencari tahu apakah harapan saya untuk menemukan dan menerapkan solusi yang benar tanpa umpan balik tentang kebenaran dalam 120 menit yang saya berikan adalah masuk akal; atau apakah ini salah satu dari pertanyaan "mari kita lihat apakah mereka pernah melihat puzzle ini sebelumnya".
Saya gagal karena saya memilih untuk menerapkan apa yang tampak seperti strategi yang masuk akal, yang memberi saya hasil yang benar untuk beberapa kasus uji yang telah saya berikan di muka, membuang-buang terlalu banyak waktu untuk menjalankan ini dengan cepat, dan akhirnya menyerahkan salah output penuh saat waktu saya habis.
Dalam retrospeksi saya harus menerapkan pencarian parsial dan hafal solusi parsial untuk angka awal yang kecil, tetapi melihat ke belakang selalu 20/20. Namun saya ingin tahu apakah ada pendekatan umum yang berbeda yang menghindari saya sebagai flunkee.
sumber
Jawaban:
Jadi satu-satunya faktor penentu dalam permainan adalah berapa banyak swap yang diperlukan untuk sampai ke keadaan di mana semua yang ada di sebelah kanan, dan tidak ada strategi menang atau kalah. Paritas dari jumlah swap yang diperlukan adalah satu-satunya faktor penentu.
total
sumber
Salah satu cara untuk memecahkan masalah tersebut adalah sebagai berikut:
Temukan solusi untuk beberapa nilai sederhana menggunakan pendekatan "memoized brute-force" yang Anda sarankan.
Tebak jawabannya (posisi mana yang menang dan yang kalah).
Cobalah buktikan jawaban Anda. Jika Anda berhasil, bagus. Jika tidak, coba temukan contoh tandingan, dan gunakan untuk menebak jawaban lain. Di sini bisa bermanfaat untuk menyelesaikan beberapa kasus lagi.
Sangat sulit untuk mengatakan berapa banyak waktu yang diperlukan. Namun, dalam wawancara Anda tidak perlu menemukan solusinya. Sebaliknya, pewawancara ingin tahu bagaimana Anda mendekati memecahkan masalah, dan kemajuan apa yang berhasil Anda buat.
sumber
Catat dari jawaban orlp @ bahwa kita menginginkan paritas jumlah perpindahan dari posisi awal ke posisi akhir. Mari kita beri catatan:
Jadi kami mau
Bagian pertama adalah paritas dari jumlah bit dalam posisi ganjil. Anda bisa menutupi itu dengan mengambil bilangan bulat unsigned maksimum, membaginya dengan 0b11 dan meniadakan.
Bagian kedua adalah paritas dari setengah jumlah bit dalam
x
.bitcount
dapat menggunakanpopcnt
instruksi perangkat keras , atau dapat diimplementasikan secara manual dengan memanfaatkan hanya bit terakhir atau kedua-ke-terakhir yang diperlukan, dengan pengurangan cepat seperti ini .sumber