Convertir des mots de chiffres anglais avec String.replace en Java
Pour une entrée valide mêlant chiffres et mots de chiffres, remplacez les mots fixes de zero à nine par des chiffres, puis analysez l’entier obtenu. Les termes recherchés sont littéraux : String.replace suffit, sans replaceAll.
L’exercice garantit des mots de chiffres valides en minuscules et des chiffres, un résultat de 1 à 2 000 000 000 et aucun zéro initial. Ce n’est pas un analyseur d’expressions numériques anglaises générales.
Déroulement
Remplacer littéralement les mots fixes de zero à nine par des chiffres, puis analyser la chaîne décimale obtenue.
Remplacer les dix mots fixes
Enregistrez la classe complète dans Solution.java. Aucun import supplémentaire n’est nécessaire ; le code de l’article source a été compilé et exécuté avec Java 11 comme cible.
public class Solution {
public int solution(String s) {
String[] words = {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
for (int digit = 0; digit < words.length; digit++) {
s = s.replace(words[digit], Integer.toString(digit));
}
return Integer.parseInt(s);
}
}
String.replace(CharSequence, CharSequence) effectue un remplacement littéral. replaceAll interprète son premier argument comme une expression régulière. Aucun des dix mots ne nécessite ici de syntaxe regex.
Par exemple, one4seveneight devient 1478 et 23four5six7 devient 234567. Une entrée déjà composée uniquement de chiffres, comme 123, donne toujours 123. two suivi de neuf mots zero donne 2 000 000 000, dans la plage de int.
Les chiffres de remplacement ne peuvent pas introduire un autre mot de chiffre, et aucun des dix mots ne contient un autre mot de l’ensemble ; cet ordre fonctionne donc. Les mots invalides, espaces, majuscules et nombres hors plage ne font pas partie des garanties de l’exercice. Un échec d’analyse sur une entrée arbitraire n’est pas réparé en entier valide par cette méthode.
Avec dix mots fixes, le temps est O(n) selon la longueur d’entrée. Les chaînes étant immuables, des chaînes intermédiaires peuvent être allouées ; l’espace supplémentaire est O(n). Aucun benchmark ne montre que cette méthode est plus rapide que d’autres analyseurs pour ces petites entrées.
Comparez la normalisation d’un nouvel identifiant pour une transformation où les expressions régulières sont utiles.
Discussion