通过将元素移到末尾来从数组中删除重复项

时间:2018-07-23 06:18:15

标签: java arrays algorithm

我需要编写一个将String []数组作为输入并返回给定的数组而不重复的方法。不允许在方法内部使用其他数组,所有逻辑必须在输入数组中完成。所有重复项都必须移到数组末尾并被截断。方法的模板:

public String[] remove(String[] array) {
    //Logic is here
    return Arrays.copyOf(array, array.length - numberOfDuplicates)
}

这是我到目前为止所做的。这适用于某些输入,但有时会给出错误的结果:

public String[] remove(String[] array) {
    int numberOfDuplicates = 0;

    for (int i = 0; i < array.length - 1 - numberOfDuplicates; i++) {
        for (int j = 0; j < array.length - 1 - numberOfDuplicates; j++) {
            if (i != j && array[i].equals(array[j])) {
                String temp = array[array.length - 1 - numberOfDuplicates];
                array[array.length - 1 - numberOfDuplicates] = array[j];
                array[j] = temp;
                numberOfDuplicates++;
            }
        }
    }
    return Arrays.copyOf(array, array.length - numberOfDuplicates);
}

可以帮我吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

当您得到比赛时,只需换成最新的最后位置即可。试试这个:

public static String[] remove(String[] array) {
    int len = array.length;
    for (int i = 0; i < len; i++) {
        for (int j = i+1; j < len && j > 0; j++) {
            if(array[i].equals(array[j])){
                String tmp = array[len -1];
                array[len - 1] = array[j];
                array[j] = tmp;
                len--;
                j--;
            }
        }
    }
    return Arrays.copyOf(array, len);
}

答案 1 :(得分:0)

请谨慎使用 Collections API。 LinkedHashSet 如下所示:

public static String[] remove(String[] array) {
    return Arrays.copyOf(array, new LinkedHashSet<String>(Arrays.asList(array)).size());
}