0

我正在尝试解决这个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;

}

所以问题是所有测试都通过了,除了一个:

在此处输入图像描述

这是为什么?

4

2 回答 2

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()方法进行比较。

于 2013-04-17T19:52:52.677 回答
1

使用 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]);
}
于 2018-04-11T10:59:23.583 回答