Gelas air kosong diatur dalam urutan berikut:
Ketika Anda menuangkan cairan ke gelas 1 jika penuh, maka cairan ekstra akan diterbangkan ke gelas 2 dan 3 dalam jumlah yang sama. Ketika gelas 2 penuh, cairan ekstra akan diterbangkan ke 4 dan 5 dan seterusnya.
Mengingat N liter cairan dan kapasitas maksimum setiap gelas adalah 1 liter, berikan jumlah cairan yang ada di gelas apa pun jika Anda mengosongkan N liter cairan dengan menuangkan ke dalam gelas dengan mengisi fungsi di getWaterInBucket(int N, int X)
mana X adalah nomor gelas. Jadi misalnya jika saya ingin memiliki 4 liter di awal dan saya ingin menemukan air dalam gelas 3 fungsinyagetWaterInBucket(4, 3)
Bagaimana cara saya menyelesaikan masalah ini secara terprogram? Saya mencoba mencari solusi matematika menggunakan segitiga Pascal. Ini tidak berhasil. Saya menganggapnya sebagai pohon sehingga saya dapat menambahkan parameter seperti ini getWaterInBucket(BTree root, int N, int X)
dan kemudian mencoba beberapa solusi rekursif untuk setiap level, tetapi parameter tidak diperbolehkan dalam masalah ini. Apakah ada sesuatu yang jelas, suatu trik?
sumber
Jawaban:
Anda hanya perlu mensimulasikan penuangan, semacamnya
Seperti berdiri, ini bukan pohon. Karena gelas yang berbeda mengalir ke gelas yang sama, itu mencegahnya menjadi pohon.
sumber
return glasses[N-1]
, karena angka-angka gelas mulai dari 1 bukannya 0.Inilah cara saya akan menjawab pertanyaan ini dalam situasi wawancara (saya belum pernah melihat pertanyaan ini sebelumnya, dan saya tidak melihat jawaban lain sampai saya punya solusi):
Pertama, saya mencoba untuk mencari tahu (yang Anda sebut "solusi matematika") dan ketika saya sampai di gelas 8 saya menyadari bahwa itu akan lebih sulit daripada yang terlihat karena gelas 5 mulai meluap sebelum kaca 4. Pada saat itu saya memutuskan untuk turun rute rekursi (hanya FYI, banyak pertanyaan wawancara pemrograman membutuhkan rekursi atau induksi untuk menyelesaikannya).
Berpikir secara rekursif, masalahnya menjadi lebih mudah: Berapa banyak air dalam gelas 8? Setengah dari jumlah yang telah tumpah dari kacamata 4 dan 5 (sampai penuh). Tentu saja, itu berarti kita harus menjawab berapa banyak yang tumpah dari kacamata 4 dan 5, tetapi ternyata itu juga tidak terlalu sulit. Berapa banyak yang tumpah dari gelas 5? Setengah dari bagaimanapun banyak tumpah dari gelas 2 dan 3, minus liter yang tinggal di gelas 5.
Memecahkan ini sepenuhnya (dan berantakan) memberi:
Pada titik ini (atau ketika saya sedang menulis ini), saya akan mengatakan kepada pewawancara bahwa ini bukan solusi yang ideal dalam produksi: ada kode duplikat antara
howMuchSpilledOutOf()
dangetWaterInBucket()
; harus ada lokasi sentral yang memetakan ember ke "pengumpan" mereka. Tetapi dalam sebuah wawancara, di mana kecepatan dan ketepatan implementasi lebih penting daripada kecepatan eksekusi dan pemeliharaan (kecuali dinyatakan sebaliknya), solusi ini lebih disukai. Kemudian saya akan menawarkan untuk memperbaiki kode agar lebih dekat dengan apa yang saya anggap berkualitas-produksi, dan biarkan pewawancara memutuskan.Catatan akhir: Saya yakin kode saya memiliki kesalahan ketik di suatu tempat; Saya akan menyebutkan hal itu kepada pewawancara juga dan mengatakan bahwa saya akan merasa lebih percaya diri setelah melakukan refactoring atau pengujian unit.
sumber
this isn't the ideal solution
.Memikirkan ini sebagai masalah pohon adalah herring merah, itu benar-benar grafik terarah. Tapi lupakan semua itu.
Pikirkan gelas di mana saja di bawah yang atas. Ini akan memiliki satu atau dua gelas di atasnya yang dapat meluap ke dalamnya. Dengan pilihan sistem koordinat yang tepat (jangan khawatir, lihat bagian akhir) kita dapat menulis fungsi untuk mendapatkan kacamata "induk" untuk setiap gelas yang diberikan.
Sekarang kita dapat memikirkan algoritma untuk mendapatkan jumlah cairan yang dituangkan ke dalam gelas, terlepas dari luapan dari gelas itu. Namun jawabannya adalah banyak cairan dituangkan ke masing-masing orangtua dikurangi jumlah yang disimpan dalam setiap gelas orangtua, dibagi dengan 2. Hanya jumlah itu untuk semua orangtua. Menulis ini sebagai fragmen python dari tubuh fungsi number_poured_into ():
Maks () adalah untuk memastikan kami tidak mendapatkan jumlah luapan negatif.
Kami hampir selesai! Kami memilih sistem koordinat dengan 'y' di bawah halaman, gelas baris pertama adalah 0, baris kedua adalah 1, dll. Koordinat 'x' memiliki angka nol di bawah kaca baris atas dan baris kedua memiliki koordinat x -1 dan +1, baris ketiga -2, 0, +2, dan seterusnya. Poin penting adalah bahwa gelas paling kiri atau paling kanan di level y akan memiliki abs (x) = y.
Membungkus semua itu menjadi python (2.x), kita memiliki:
Jadi untuk mendapatkan jumlah sebenarnya dalam gelas di p, gunakan jumlah_in (total, p).
Tidak jelas dari OP, tetapi sedikit tentang "Anda tidak dapat menambahkan parameter" mungkin berarti pertanyaan asli harus dijawab dalam hal nomor kaca yang ditampilkan. Ini diselesaikan dengan menulis fungsi pemetaan dari nomor kaca pertunjukan ke sistem koordinat internal yang digunakan di atas. Itu fiddly, tetapi solusi iteratif atau matematis dapat digunakan. Fungsi iteratif yang mudah dipahami:
Sekarang cukup tulis ulang fungsi number_in () di atas untuk menerima nomor gelas:
sumber
Menarik.
Ini mengambil pendekatan simulasi.
yang mencetak (untuk 6 liter):
yang tampaknya benar.
sumber
Ini adalah fungsi binomial. Rasio air antara gelas level N dapat ditemukan menggunakan nCr untuk setiap gelas di level tersebut. Selain itu, jumlah total kacamata sebelum ke level N adalah jumlah dari 1 hingga (N - 1), sebuah formula yang Anda harus dapat menemukannya dengan cukup mudah. Jadi, mengingat X, Anda harus dapat menentukan levelnya, dan menggunakan nCr untuk memeriksa rasio kacamata untuk level itu, dan dengan demikian menentukan berapa banyak air dalam X, jika ada cukup liter untuk turun ke X.
Kedua, ide Anda menggunakan BTree baik-baik saja, hanya saja BTree adalah variabel internal, bukan parameter eksternal.
TKI, jika Anda sudah membahas matematika ini dalam pendidikan Anda (di Inggris ini diajarkan sebelum masuk universitas) maka Anda harus dapat menyelesaikannya tanpa terlalu banyak masalah.
sumber