从整数数组中删除重复整数 - 伪代码

时间:2012-06-18 16:35:56

标签: algorithm

我需要一些帮助才能做到这一点,

问题 编写一个带2个数组的函数 - 一个数组是源数组,另一个数组是索引数组,删除源数组索引处的所有元素,从第二个数组中获取索引。

这就是我想出的......

 public static int[] DeleteArrayUsingIndices(int[] source, int[] indices)
    {
        for (int i = 0; i < indices.Length; i++)
        {
            if (indices[i] < source.Length)
            {
                source[indices[i]] = int.MinValue; // delete
            }                
        }

        return source;
    }

我不太确定这个解决方案,因为这不会删除该值。任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

您无法真正删除数组中的元素,因此您需要询问此措辞的含义。如果用特殊元素(例如代码中的int.MinValue)替换元素是可以接受的,那么您的解决方案就可以了。

另一种解释可能是重新排列数组,因此“未删除”索引处于数组的开头,其顺序与原始数据相同 - 在这种情况下,您希望返回新的“长度”数组(未被“删除”的元素数) - 这意味着“删除”操作会将尚未删除的元素数组压缩到数组的开头(将数组的内容向开头移动)从已删除的索引到数组的末尾(或到未删除元素的末尾)。必须注意不要两次“删除”相同的元素。

要实现后者,您必须跟踪移动了多少元素的位置。或者,更新索引数组以减小大于当前索引的索引(以适应现在压缩的数组) - 在这种情况下,您可以首先对索引数组进行排序(可能同时删除重复项),然后跟踪如何到目前为止,许多职位都已转移

答案 1 :(得分:1)

试试这个

public static void main(String[] args) {
    Integer[] a = {1,2,3,4,5,6,7,8,9};
    Integer[] b = {2,3};
    System.out.println(Arrays.asList(deleteArrayUsingIndices(a, b)));
}

^用于测试

public static Integer[] deleteArrayUsingIndices(Integer[] source, Integer[] indices)
{
    ArrayList<Integer> sourceArr = new ArrayList<Integer>(Arrays.asList(source));
    ArrayList<Integer> toDelete = new ArrayList<Integer>();
    for (int i:indices)
    {
        try {
            toDelete.add(sourceArr.get(i));
        } catch (Exception e) {}              
    }

    sourceArr.removeAll(toDelete);

    return sourceArr.toArray(new Integer[sourceArr.size()]);
}