Maison > Article > interface Web > Chroniques de codage dactylographié : compression de chaînes
Étant donné un tableau de caractères, compressez-le en utilisant l'algorithme suivant :
La chaîne compressée s ne doit pas être renvoyée séparément, mais plutôt être stockée dans le tableau de caractères d'entrée chars. Notez que les longueurs de groupe de 10 ou plus seront divisées en plusieurs caractères en caractères.
Une fois que vous avez terminé de modifier le tableau d'entrée, renvoyez la nouvelle longueur du tableau.
Vous devez écrire un algorithme qui utilise uniquement un espace supplémentaire constant.
Pour résoudre ce problème, nous devons parcourir le tableau tout en gardant une trace du caractère actuel et de son nombre. Lorsque nous rencontrons un nouveau caractère, nous ajoutons le caractère actuel et son nombre (s'il est supérieur à 1) au tableau. Nous devons nous assurer que nous le faisons en place pour répondre aux exigences de complexité spatiale.
La solution par force brute consiste à créer un nouveau tableau pour stocker la version compressée du tableau d'entrée. Ce n'est pas efficace en termes d'espace mais nous aide à comprendre les étapes à suivre.
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; }
La solution par force brute n'est pas économe en espace et ne répond pas à la contrainte d'utiliser uniquement un espace supplémentaire constant.
La solution optimisée consiste à modifier le tableau d'entrée en place pour stocker la version compressée. Nous utilisons deux pointeurs : un pour lire le tableau d'entrée et un pour écrire la sortie compressée.
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> Analyse de la complexité temporelle : </h3> <ul> <li> <strong>Complexité temporelle :</strong> O(n), où n est la longueur du tableau. Nous parcourons le tableau une fois pour compter les caractères et une fois pour écrire le résultat.</li> <li> <strong>Complexité spatiale :</strong> O(1), car nous n'utilisons qu'une quantité constante d'espace supplémentaire pour les variables.</li> </ul> <h3> Améliorations par rapport à la solution de base : </h3> <ul> <li>La solution optimisée réduit la complexité spatiale à O(1) en modifiant le tableau d'entrée en place.</li> </ul> <h2> Cas extrêmes et tests : </h2> <h3> Cas extrêmes : </h3> <ol> <li>Le tableau ne contient qu'un seul caractère.</li> <li>Le tableau ne contient aucun caractère répétitif consécutif.</li> <li>Le tableau contient un grand nombre de caractères répétitifs consécutifs.</li> </ol> <h3> Cas de tests : </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"]
Manipulation de chaînes :
Algorithmes sur place :
En pratiquant de tels problèmes et stratégies, vous pouvez améliorer vos compétences en résolution de problèmes et être mieux préparé à relever divers défis de codage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!