编写一个方法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。 请帮忙!
答案 0 :(得分:4)
您无法删除数组中的元素,根据定义它们是固定大小的。您可以做的是创建一个新数组,复制旧数组中除了要删除的数组之外的所有元素并返回新数组。或者,使用ArrayList
,其中包含允许删除元素的操作:
答案 1 :(得分:1)
首先,遍历你的数组,找出你的目标元素有多少。
一旦你知道,你知道新阵列的大小。正如奥斯卡提到的那样,你不能从数组中“删除”,你只需创建一个没有你不想要的元素的新数组。
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++;
}
}
这里我们遍历旧数组并检查每个元素以查看它是否是我们的目标。如果不是,我们将其添加到新阵列。我们必须独立跟踪旧数组的索引和新数组的索引,否则我们可能会冒险尝试在数组边界之外分配索引。
答案 2 :(得分:0)
这是一个常见的面试问题。在奥斯卡提出的解决方案中,您不知道新阵列的大小。因此解决方案不起作用或内存效率低下。
Trick是遍历数组,当你遇到一个等于给定元素的元素时,你将该元素放在数组的末尾,并将它与最终位置处的元素交换。通过这样做,您将收集数组末尾的所有给定元素。
这是一个工作逻辑
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);
}