我目前正在进行一项编码挑战,内容如下:
给定一个单词列表,返回只能在美式键盘的一行上使用字母表字母键入的单词,如下图所示(这是QWERTY键盘的图像)。
示例:
Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]
- 我所做的就是**写一个for循环,然后用if语句将所有行替换为
""
(就像QWERTY),如果这个长度大于1,那么你就不能在一行中输入这个单词。我得到的输出几乎是正确的,但是我的数组包含空元素。
- 我所做的就是**写一个for循环,然后用if语句将所有行替换为
我的输出是:
[null,"Alaska","Dad",null]
- 如何返回一个没有这些空元素的数组?**要完成此挑战,我必须返回一个
String[]
数组。我不能使用ArrayList
返回。
- 如何返回一个没有这些空元素的数组?**要完成此挑战,我必须返回一个
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;
}
}
7条答案
按热度按时间xxhby3vn1#
使用这一个内衬:
筛选数组并获取所有非Null的对象。不要忘记将流转换回数组。
o2gm4chl2#
可以使用以下命令从字符串数组中删除所有空值:
8tntrjer3#
原来的问题是你返回的
Array
和原来的Array
大小相同,所以如果任何元素不匹配,Array
中的一个槽将保留默认值,即null
,你需要跟踪需要复制多少项,你可以用计数器和Arrays.copyOf()
来完成。就其价值而言,Java 8+可以做到:
它将使用
Stream.of
创建一个Stream
的行,并通过words
数组进行筛选,仅保留键盘上单行中仅由字母组成的行fcy6dtqo4#
如果确实需要返回String数组,可以只使用ArrayList而不是数组,然后在最后调用
toArray
。z0qdvdin5#
你的结果数组是用单词数组的大小初始化的,你可以用ArrayList动态赋值。
之后可以返回ArrayList的toArray方法,这样就可以返回所需的条纹数组。
如果不允许在代码中使用ArrayList,我将研究如何动态调整结果数组的大小。
jv2fixgn6#
尝试将非空值存储在不同的变量中并对它们进行计数,用计数值初始化另一个数组,然后将值复制到后一个数组中。演示如下:
}
eufgjt7s7#
减小包含空元素的数组大小的一种方法是使用.filter()方法。此方法将遍历数组的每个元素并检查其是否为空。如果不为空,则将该元素添加到新数组中。然后将返回新数组,该新数组将仅包含非空的元素。