Rumah > hujung hadapan web > tutorial js > Laporan Hidung Merah

Laporan Hidung Merah

DDD
Lepaskan: 2024-12-04 19:47:11
asal
201 orang telah melayarinya

Red-Nosed Reports

Kedatangan Kod 2024 Hari 2

Bahagian 1

Untuk menyelesaikan sahaja, atau menyelesaikan secara optimum? Itulah persoalannya

Untuk menyelesaikan sahaja:

  • Bandingkan senarai dalam susunan asal kepada dua salinan, setiap satu diisih, tetapi dalam susunan terbalik. Jika satu perlawanan, maka kejayaan untuk kriteria satu
  • Lelar melalui setiap item dalam senarai, kecuali yang pertama. Jejaki perbezaan setiap item dan item sebelumnya. Jika sebarang perbezaan adalah 0 atau lebih daripada 3, maka ujian ini gagal.

Dari segi prestasi, ini bermakna:
Untuk kriteria 1:

  • Dua salinan senarai
  • Isih setiap salinan
  • Membandingkan senarai asal dua kali Untuk kriteria 2:
  • Semak setiap nombor dalam setiap senarai

Untuk menyelesaikan secara optimum:

  • Untuk kriteria 2, saya akan memanfaatkan gelung sementara untuk menyemak nombor berikutnya untuk perbezaan yang sah. Dengan cara itu, sebaik sahaja perbezaan hilang kelayakan berlaku, selebihnya nombor tidak akan diproses
  • Untuk kriteria 1, saya akan menjejaki perbezaan, kemudian melakukan satu periksa sama ada semuanya kurang daripada atau lebih besar daripada sifar

Saya rasa ini akan berjaya. Hanya satu cara untuk mengetahuinya.

Menulis algoritma yang dioptimumkan

Ini kod saya untuk mengenal pasti kriteria 2 (perbezaan 1, 2, atau 3):

let differFlag = true;
let i = 1;
while (differFlag && i < list.length) {
  let amount = Math.abs(list[i] - list[i - 1]);
  if (![1, 2, 3].includes(amount)) {
    differFlag = false;
  }
  i++;
}
Salin selepas log masuk
  • Saya hanya 'menjalankan' senarai sehingga perbezaan yang tidak sah ditangkap, jika ada
  • Sebaik sahaja seseorang ditangkap, gelung sementara keluar
  • Selepas gelung sementara, saya boleh menyemak differFlag untuk keputusan

Ini kod saya untuk mengenal pasti kriteria 1 (semua perbezaan bertambah atau berkurang):

let differFlag = true;
let i = 1;
let differences = [];
while (differFlag && i < list.length) {
  let amount = list[i] - list[i - 1];
  differences.push(amount);
  if (![1, 2, 3].includes(Math.abs(amount))) {
    differFlag = false;
  }
  i++;
}
Salin selepas log masuk
  • Saya membuat senarai setiap perbezaan
  • Saya mengalihkan pengiraan nilai mutlak kepada bersyarat kerana saya sebenarnya mahu menangkap tanda perbezaan
  • Selepas gelung sementara, saya boleh menyemak perbezaan untuk melihat sama ada setiap nilai adalah positif atau negatif

Berikut ialah syarat akhir yang menangkap laporan selamat:

if (
     differFlag &&
    (differences.every((el) => el > 0) || 
     differences.every((el) => el < 0))
    ) {
      safeCount++;
    }
Salin selepas log masuk

Secara keseluruhannya, algoritma saya menjana jawapan yang betul untuk input contoh.

Adakah ia akan melakukan perkara yang sama untuk input teka-teki saya??

Yessssirrrreeee!!

Sweet!

Bahagian 2

Welllll...tembak.

Ini sudah tentu merumitkan sedikit perkara.

Saya ingin mengelakkan algoritma yang menyemak setiap pilih atur yang mungkin bagi laporan. Itu memerlukan penjanaan berjuta-juta laporan.

Berita baik pertama ialah:

  • Semua laporan selamat masih boleh dikira selamat

Untuk input teka-teki saya, kira-kira 200 yang tidak memerlukan saya menyemak pilih atur.

Namun, 800/1000 masih merupakan banyak senarai untuk meneroka pilih atur sepenuhnya.

Sejujurnya saya tidak nampak cara untuk mengelak daripada menjalankan algoritma saya pada setiap pilih atur laporan tidak selamat.

Mengecewakan.

Masa untuk menambah gelung untuk berulang melalui setiap nombor dalam laporan tidak selamat - nombor untuk dialih keluar dan kemudian menyemak senarai bermutasi untuk gred lulus.

Menambah gelung semakan pilih atur

Saya akhirnya menduplikasi gelung while saya dengan baris tambahan untuk menduplikasi dan mengalih keluar satu nombor daripada setiap laporan ujian berikutnya.

Ia lebih banyak kod.

Tetapi, ia berkesan! Saya menjana jawapan yang betul untuk input teka-teki!

Soalannya ialah:

  • Adakah ia akan berjalan...dan menjana jawapan yang betul untuk input teka-teki saya?

Jom jalankan dan lihat...

Hmmm, ia berjalan, tetapi saya mendapat jawapan bahawa ia hanya lebih besar sedikit daripada jawapan Bahagian 1 saya. Nampaknya salah.

Tak rugi nak submit kan????

Ia adalah betul!

Asap suci!

Sungguh luar biasa!

Dan sangat menyeronokkan untuk diselesaikan!

Empat bintang emas akan memasuki Hari 3.

Bawakan lebih banyak teka-teki yang menarik!

Atas ialah kandungan terperinci Laporan Hidung Merah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan