Je suis en train de faire un défi de codage qui stipule:
Étant donné une liste de mots, renvoie les mots qui peuvent être tapés en utilisant des lettres de l'alphabet sur une seule ligne du clavier américain comme l'image ci-dessous (qui est une image de un clavier QWERTY).
Exemple:
class Solution { public String[] findWords(String[] words) { String[] result = new String[words.length]; String row1 = "qwertyuiop"; String row2 = "asdfghjkl"; String row3 = "zxcvbnm"; for (int i = 0 ; i < words.length; i++) { if (words[i].toLowerCase().replaceAll("[" + row1 + "]", "").length() == 0 || words[i].toLowerCase().replaceAll("[" + row2 + "]", "").length() == 0 || words[i].toLowerCase().replaceAll("[" + row3 + "]", "").length() == 0) { if (words[i] != null) { result[i] = words[i]; } } } return result; } }
Ce que j'ai fait pour résoudre ce problème est d'écrire une boucle for, alors faites si les instructions qui remplacent toutes les lignes (comme QWERTY) par ""
et si la longueur de ceci est supérieure à 1, alors vous ne pouvez pas taper ce mot sur une ligne. J'obtiens presque la sortie correcte, mais mon tableau contient des éléments nuls.
Ma sortie est:
[null,"Alaska","Dad",null]
Comment puis-je retourner un tableau qui n'a pas ces éléments nuls? Pour compléter ce défi, je dois renvoyer un tableau String []
. Je ne peux pas utiliser une ArrayList
pour retourner.
Input: ["Hello", "Alaska", "Dad", "Peace"] Output: ["Alaska", "Dad"]
6 Réponses :
Le problème initial est que vous renvoyiez un Array
qui était de la même taille que le Array
d'origine. Donc, si l'un des éléments ne correspond pas, un emplacement dans le Array
conservera sa valeur par défaut, qui est null
. Vous devez garder une trace du nombre d'éléments à copier. Vous pouvez le faire avec un compteur et Arrays.copyOf ()
.
Juste pour ce que ça vaut, Java 8+, nous pouvons le faire:
public static String[] findWords(String[] words) { return Stream.of("asdfghjkl", "qwertyuiop", "zxcvbnm") .filter(row -> Arrays.stream(words) .anyMatch(e -> e.replaceAll("[" + row + "]","") .isEmpty()) ).toArray(String[]::new); }
Vous pouvez utiliser ce qui suit pour supprimer toutes les valeurs nulles d'un tableau de chaînes:
List<String> list = new ArrayList<String>(Arrays.asList(myArray)); list.removeAll(Collections.singleton(null)); String[] result = list.toArray(new String[list.size()]);
Votre tableau de résultats est initialisé avec la taille du tableau de mots. Vous pouvez utiliser ArrayList pour l'attribution dynamique.
Une fois que vous pouvez renvoyer la méthode toArray de ArrayList, vous retournerez le tableau de séparation souhaité.
Si vous n'êtes pas autorisé à utiliser ArrayList dans le code, je chercherais comment dimensionner mon tableau de résultats dynamiquement.
En utilisant cette seule ligne:
Arrays.stream(result).filter(Objects::nonNull).toArray(String[]::new)
Filtre le tableau et récupère tous les objets qui ne sont pas Null. N'oubliez pas de transformer le flux en un tableau.
Vous pouvez simplement utiliser une ArrayList au lieu d'un tableau, puis appeler toArray
à la fin si vous avez vraiment besoin de renvoyer un tableau String.
public String[] findWords(String[] words) { List<String> result = new ArrayList<>(); String row1 = "qwertyuiop"; String row2 = "asdfghjkl"; String row3 = "zxcvbnm"; for (int i = 0; i < words.length; i++) { if (words[i].toLowerCase().replaceAll("[" + row1 + "]", "").length() == 0 || words[i].toLowerCase().replaceAll("[" + row2 + "]", "").length() == 0 || words[i].toLowerCase().replaceAll("[" + row3 + "]", "").length() == 0) { if (words[i] != null) { result.add(words[i]); } } } return result.toArray(new String[0]); }
Essayez de stocker les valeurs non nulles dans une variable différente et comptez-les, initialisez un autre tableau avec le nombre et copiez les valeurs dans ce dernier tableau. Démontré comme suit:
class Solution { public static String[] findWords(String[] words) { String[] resultWithNull = new String[words.length]; int counter = 0; String row1 = "qwertyuiop"; String row2 = "asdfghjkl"; String row3 = "zxcvbnm"; for (int i = 0 ; i < words.length; i++) { if (words[i].toLowerCase().replaceAll("[" + row1 + "]", "").length() == 0 || words[i].toLowerCase().replaceAll("[" + row2 + "]", "").length() == 0 || words[i].toLowerCase().replaceAll("[" + row3 + "]", "").length() == 0) { if (words[i] != null) { resultWithNull[counter] = words[i]; ++counter; } } } String[] result = new String[counter]; for (int i = 0 ; i < counter; i++) { result[i] = resultWithNull[i]; } return result; }
}
voir stackoverflow.com/questions/24112715/… dans la question, remplacez
i> 0
pari! = null
Copie possible de Supprimer la valeur Null du tableau de chaînes en Java