我正在尝试解决this CodingBat问题:
从两个字符串数组开始,A和B,每个字符串的元素按字母顺序排列,没有重复。返回一个包含两个数组中前N个元素的新数组。结果数组应按字母顺序排列,不得重复。 A和B的长度均为N或更大。最好的“线性”解决方案通过A和B进行单次传递,利用它们按字母顺序排列的事实,将元素直接复制到新数组。
mergeTwo({"a", "c", "z"}, {"b", "f", "z"}, 3) → {"a", "b", "c"}
mergeTwo({"a", "c", "z"}, {"c", "f", "z"}, 3) → {"a", "c", "f"}
mergeTwo({"f", "g", "z"}, {"c", "f", "g"}, 3) → {"c", "f", "g"}
尝试:
public String[] mergeTwo(String[] a, String[] b, int n) {
String[] op = new String[a.length + b.length];
for (int i = 0; i < a.length; i++) {
op[i] = a[i];
}
int j = 0;
for (int i = 0; i < op.length; i++) {
if (op[i] == null) {
j = i;
break;
}
}
for (int i = 0; i < b.length; i++) {
op[j] = b[i];
j++;
}
Arrays.sort(op);
ArrayList<String> help = new ArrayList<String>();
for (int i = 0; i < op.length - 1; i++) {
if (op[i] != op[i + 1]) {
help.add(op[i]);
}
}
String[] res = new String[help.size()];
for (int i = 0; i < help.size(); i++) {
res[i] = help.get(i);
}
String[] op2 = new String[n];
for (int i = 0; i < n; i++) {
op2[i] = res[i];
}
return op2;
}
所以问题是所有的测试都通过了,除了一个:
为什么?
答案 0 :(得分:1)
这是有问题的一行:
if (op[i] != op[i + 1]) {
您正在寻找一种模式,其中几个相同字符串的lsst与下一个字符串不匹配。
在失败的情况下,没有“下一个字符串”,因为正好有3个唯一字符串。
处理这种情况的一种方法是查找一个模式,其中此字符串与最后一个字符串不同,但您并没有真正检查数组中的最后一个字符串(因为第一个数组元素没有最后一个字符串)。您使用变量(例如last
)来存储最后一个字符串,并仅在此元素不等于last
时进行传输。
试试这个......
String last = "";
for (int i = 0; i < op.length - 1; i++) {
if (!op[i].equals(last)) {
help.add(op[i]);
}
last = op[i];
}
另请注意,在Java中,字符串与equals()
方法进行比较。
答案 1 :(得分:0)
使用Java8,可以使用几行简单的代码完成:
public String[] mergeTwo(String[] a, String[] b, int n)
{
Set<String> set = new HashSet();
set.addAll(Arrays.asList(a));
set.addAll(Arrays.asList(b));
List<String> list = new ArrayList(set);
return list.subList(0, n).toArray(new String[n]);
}