Memandangkan tatasusunan aksara aksara, mampatkannya menggunakan algoritma berikut:
Rentetan termampat s tidak seharusnya dikembalikan secara berasingan, sebaliknya, disimpan dalam aksara tatasusunan aksara input. Ambil perhatian bahawa panjang kumpulan yang 10 atau lebih lama akan dibahagikan kepada berbilang aksara dalam aksara.
Selepas anda selesai mengubah suai tatasusunan input, kembalikan panjang tatasusunan baharu.
Anda mesti menulis algoritma yang hanya menggunakan ruang tambahan yang berterusan.
Untuk menyelesaikan masalah ini, kita perlu mengulangi tatasusunan sambil menjejaki watak semasa dan kiraannya. Apabila kami menemui watak baharu, kami menambahkan aksara semasa dan kiraannya (jika lebih daripada 1) pada tatasusunan. Kami perlu memastikan bahawa kami melakukan ini di tempat untuk memenuhi keperluan kerumitan ruang.
Penyelesaian brute force melibatkan mencipta tatasusunan baharu untuk menyimpan versi termampat tatasusunan input. Ini tidak cekap ruang tetapi membantu kami memahami langkah-langkah yang terlibat.
function compressBruteForce(chars: string[]): number { const n = chars.length; let compressed: string[] = []; let i = 0; while (i < n) { let char = chars[i]; let count = 0; while (i < n && chars[i] === char) { i++; count++; } compressed.push(char); if (count > 1) { compressed.push(...count.toString().split('')); } } for (let j = 0; j < compressed.length; j++) { chars[j] = compressed[j]; } return compressed.length; }
Penyelesaian brute force tidak cekap ruang dan tidak memenuhi kekangan menggunakan hanya ruang tambahan yang berterusan.
Penyelesaian yang dioptimumkan melibatkan pengubahsuaian tatasusunan input yang sedia ada untuk menyimpan versi termampat. Kami menggunakan dua penunjuk: satu untuk membaca tatasusunan input dan satu untuk menulis output termampat.
function compress(chars: string[]): number { let writeIndex = 0; let i = 0; while (i < chars.length) { let char = chars[i]; let count = 0; // Count the number of consecutive repeating characters while (i < chars.length && chars[i] === char) { i++; count++; } // Write the character chars[writeIndex] = char; writeIndex++; // Write the count if greater than 1 if (count > 1) { let countStr = count.toString(); for (let j = 0; j < countStr.length; j++) { chars[writeIndex] = countStr[j]; writeIndex++; } } } return writeIndex; } <h3> Analisis Kerumitan Masa: </h3> <ul> <li> <strong>Kerumitan Masa:</strong> O(n), dengan n ialah panjang tatasusunan. Kami mengulangi tatasusunan sekali untuk mengira aksara dan sekali untuk menulis hasilnya.</li> <li> <strong>Kerumitan Angkasa:</strong> O(1), kerana kami hanya menggunakan jumlah ruang tambahan yang tetap untuk pembolehubah.</li> </ul> <h3> Penambahbaikan Daripada Penyelesaian Asas: </h3> <ul> <li>Penyelesaian yang dioptimumkan mengurangkan kerumitan ruang kepada O(1) dengan mengubah suai tatasusunan input di tempatnya.</li> </ul> <h2> Kes Edge dan Ujian: </h2> <h3> Kes Tepi: </h3> <ol> <li> Tatasusunan mengandungi hanya satu aksara.</li> <li> Tatasusunan tidak mengandungi aksara berulang berturut-turut.</li> <li> Tatasusunan mengandungi sejumlah besar aksara berulang berturut-turut.</li> </ol> <h3> Kes Ujian: </h3> <pre class="brush:php;toolbar:false">console.log(compressBruteForce(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"] console.log(compressBruteForce(["a"])); // 1, ["a"] console.log(compressBruteForce(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"] console.log(compressBruteForce(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"] console.log(compressBruteForce(["a","b","c"])); // 3, ["a","b","c"] console.log(compress(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"] console.log(compress(["a"])); // 1, ["a"] console.log(compress(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"] console.log(compress(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"] console.log(compress(["a","b","c"])); // 3, ["a","b","c"]
Manipulasi Rentetan:
Algoritma Di Tempat:
Dengan mempraktikkan masalah dan strategi sedemikian, anda boleh meningkatkan kemahiran menyelesaikan masalah anda dan lebih bersedia untuk pelbagai cabaran pengekodan.
Atas ialah kandungan terperinci Taip Pengekodan Tawarikh: Mampatan Rentetan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!