1

编写一个方法 deleteElement,它将一个 int[] 和一个 int 目标作为输入,并从数组中删除所有出现的目标。该方法应返回 newint[] 。需要考虑的问题:为什么我们必须返回一个数组而不能简单地更改输入参数数组?

public class warm5{
  public static void main(String[] args){
    int[] array1= {1,2,2,3,4,5,2};
    int target1 = 2;
    deleteElement(array1,target1);

    public static int[] deleteElement(int[] array, int target){
      for(int i = 0, i<array.length, i++){
        if(array1[i] == target){

        }
      }
    }
  }
}

这是我写的,我不确定如何继续删除数组中的 2。请帮忙!

4

3 回答 3

4

不能从数组中删除元素,根据定义它们的大小是固定的。您可以做的是创建一个新数组,复制旧数组中的所有元素,除了您打算删除的元素并返回新数组。或者,使用ArrayList,它具有允许删除元素的操作:

于 2013-10-29T19:41:53.080 回答
1

首先,遍历您的数组并确定存在多少目标元素。

一旦你知道了,你就知道你的新数组的大小了。正如 Oscar 所提到的,您不能从数组中“删除”,您只需创建一个没有您不想要的元素的新数组。

int targetCount = 0;

for (int i = 0; i < array.length; i++) {
    if (array[i] == target) {
        targetCount++;
    }
}

现在您知道新数组中有多少项目:array.length-targetCount.

int[] newArray = new int[array.length-targetCount];
int newArrayIdx = 0;
for (int i = 0; i < array.length; i++) {
    if (array[i] != target) {
        newArray[newArrayIdx] = target;
        newArrayIdx++;
    }
}

在这里,我们遍历旧数组并检查每个元素以查看它是否是我们的目标。如果不是,我们将其添加到新数组中。我们必须独立跟踪旧数组的索引和新数组的索引,否则我们可能会冒险尝试在数组边界之外分配索引。

于 2013-10-29T19:47:17.393 回答
0

这是一个常见的面试问题。在 Oscar 提出的解决方案中,您不知道新数组的大小。因此该解决方案不起作用或内存效率低下。

诀窍是遍历数组,并且在任何时候遇到与给定元素相等的元素时,将该元素放在数组的末尾并将其与末尾位置的元素交换。通过这样做,您将在数组末尾收集所有出现的给定元素。

这是一个工作逻辑

deleteElement(int[] given, int elem) {

  int endIdx = array.length - 1;
  for(int idx = 0; idx <= endIdx; idx++) {
    if(given[idx] == elem) {
      //swap idx with endIdx
      int tmp = given[endIdx];
      given[endIdx] = given[idx];
      given[idx] = tmp;
      endIdx--;
    }
  }

  return Arrays.copyOfRange(given, 0, endIdx);

}
于 2013-10-29T19:56:23.613 回答