首页 > 试题广场 >

移除数组中的元素

[编程题]移除数组中的元素
  • 热度指数:186091 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果数组返回
示例1

输入

[1, 2, 2, 3, 4, 2, 2], 2

输出

[1, 3, 4]
题目要求在原数组上面直接修改,删除数组元素,可以用splice方法,给其传递两个参数,第一个参数表示起始位置,第二个参数表示删除元素的个数。因此,循环遍历数组arr,如果arr[i] == item,就将i作为第一个参数,1作为第二个参数(只删除一个元素)传给splice方法。需要注意的是,splice方***改变数组的长度,因此在每次删除之后,都需要执行i--以确保数组长度正确。
function removeWithoutCopy(arr, item) {
     for(var i = 0; i < arr.length; i++){
         if(arr[i] == item){
             //splice方***改变数组长度,当减掉一个元素后,后面的元素都会前移,因此需要相应减少i的值
             arr.splice(i,1);
             i--;
         }
     }
     return arr;
 }

编辑于 2015-08-18 13:48:22 回复(19)
更多回答
推荐
function removeWithoutCopy(arr, item) {
	for(var i=0; i<arr.length; i++)
	{
		if(item == arr[i])
		{
			arr.splice(i,1);
			i--;
		}
	}
    return arr;
}
splice(index,len,[item])    注释:该方***改变原始数组。
splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值
index:数组开始下标        len: 替换/删除的长度       item:替换的值,删除操作的话 item为空
如:arr = ['a','b','c','d']

删除 ----  item不设置
arr.splice(1,1)   //['a','c','d']         删除起始下标为1,长度为1的一个值,len设置的1,如果为0,则数组不变
arr.splice(1,2)  //['a','d']          删除起始下标为1,长度为2的一个值,len设置的2

替换 ---- item为替换的值
arr.splice(1,1,'ttt')        //['a','ttt','c','d']         替换起始下标为1,长度为1的一个值为‘ttt’,len设置的1
arr.splice(1,2,'ttt')        //['a','ttt','d']         替换起始下标为1,长度为2的两个值为‘ttt’,len设置的1

添加 ----  len设置为0,item为添加的值
arr.splice(1,0,'ttt')        //['a','ttt','b','c','d']         表示在下标为1处添加一项‘ttt’

看来还是splice最方便啦
编辑于 2015-08-18 21:24:43 回复(47)
不用考虑数组长度的方法
function removeWithoutCopy(arr, item) {
    var flag = true;
    while(flag){
        var index = arr.indexOf(item);
        if(index != -1){
            arr.splice(index, 1);
        }else{
            flag = false;
        }
    }
return arr;
}
发表于 2016-03-28 09:48:34 回复(1)
function removeWithoutCopy(arr, item) {
    let index = 0
    // 循环的起始点为上一个相同元素被删除的地方
     while(arr.indexOf(item, index) !== -1) {
         index = arr.indexOf(item)
         arr.splice(index, 1)
     }
    return arr
}

发表于 2021-08-25 09:05:48 回复(0)
function removeWithoutCopy(arr, item) {
    while(arr.indexOf(item)!=-1) {
        arr.splice(arr.indexOf(item),1);
    }
    return arr;
}

发表于 2021-08-16 20:45:48 回复(0)
function removeWithoutCopy(arr, item) {
    for(let i = 0;i< arr.length;) {
        if(arr[i] === item) {
            arr.splice(i, 1);
        } else {
            i++;
        }
    }
    return arr;
}
发表于 2021-07-29 16:10:24 回复(0)
    do{
        arr.splice(arr.indexOf(item),1);
    }while(arr.indexOf(item)> -1)
        return arr;
发表于 2021-01-27 09:40:34 回复(0)
用递归的方式处理

function removeWithoutCopy(arr, item) {
    let i = arr.indexOf(item)
    if(i > -1){
        arr.splice(i,1)
        return removeWithoutCopy(arr,item)
    } else {
        return arr
    }
}

发表于 2021-01-26 15:02:43 回复(0)
let num = 0
function removeWithoutCopy(arr, item) {
    if(num > arr.length){return arr}
    arr[num] === item ? arr.splice(arr.indexOf(item), 1) : num += 1
    return removeWithoutCopy(arr,item)
}
递归的思路,最快1288ms

发表于 2020-05-16 15:29:30 回复(0)
function removeWithoutCopy(arr, item) {
    for(let i = 0; i < arr.length; i++){
        if (arr[i] == item){
           arr.splice(i,1);
           i--; 
        } 
    }
    return arr;
}

发表于 2020-03-24 11:25:35 回复(0)
最多删除arr.length个元素,所有数字循环arr.length次,用indexOf找到符合条件的位置,然后删除。
function removeWithoutCopy(arr, item) {
    for (let i = 0, len = arr.length; i < len; i++) {
        const index = arr.indexOf(item);
        if (index !== -1) {
            arr.splice(index, 1);
        }
    } 
    return arr;   
}

发表于 2019-10-24 16:24:47 回复(0)
function removeWithoutCopy(arr, item) {
    for (let i = arr.length - 1; i >= 0; i--) {
      if (arr[i] == item) {
        arr.splice(i, 1);
      }
    }
    return arr;
}

发表于 2019-09-09 13:14:55 回复(0)
function removeWithoutCopy(arr, item) {
    let indexOfItem = arr.indexOf(item)
    if (indexOfItem !== -1) {
        arr.splice(indexOfItem, 1)
        removeWithoutCopy(arr, item)
    }
    return arr
}
发表于 2019-08-26 17:37:33 回复(0)
function removeWithoutCopy(arr, item) {
    for(var i=arr.length-1;i>=0;i--){
        if(arr[i]===item){
            arr.splice(i,1);
            i++;
        }
    }
    return arr;
}
从后往前删,每删除一个元素,都要i++,因为你长度-1了,不加回来的话会跳过一个。
发表于 2019-08-24 09:03:12 回复(0)
function removeWithoutCopy(arr, item) {
    for(var i=0;i<arr.length;i++){
        if(arr[i]==item){
          arr.splice(i,1);
            i--;
        }
    }
    return arr;
}
发表于 2018-03-30 22:53:33 回复(0)
function removeWithoutCopy(arr, item) {
    for(var i=arr.length,obj;obj=arr[--i];){
        obj === item && arr.splice(i,1);
    }
    return arr;
}
发表于 2018-03-14 00:05:36 回复(0)
function removeWithoutCopy(arr, item) {
for(var i=arr.length;i>0;i--){
if(item===arr[i]){
arr.splice(i,1);
}
};
return arr;
}
发表于 2018-02-02 21:38:50 回复(0)
function removeWithoutCopy(arr, item) {
    while (arr.indexOf(item) !== -1) {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] === item) {
                arr.splice(i, 1);
                break
            }
        }
    }
    return arr;
}
发表于 2017-11-21 14:55:33 回复(1)
function removeWithoutCopy(arr, item) {
  for(var i = arr.length-1;i >= 0;i--){
      var value = arr[i];
      if(value == item){
          arr.splice(i,1);
      }
  }
    return arr;
}

发表于 2017-08-29 16:54:41 回复(0)
function removeWithoutCopy(arr, item) {
	for(var i=0;i<arr.length;i++){
        if(arr[i]===item){
            arr.splice(i,1);
            i=0;
        }
    }
    return arr;
}

测试通过!
编辑于 2017-04-09 20:27:08 回复(2)
L`头像 L`
var n=0;
    for(var i=0;i<arr.length;i++){
        if(arr[i]!=item){
            arr[n]=arr[i];
            n++;
        }
    }
    arr.length = n;
    return arr;
发表于 2017-03-16 17:13:14 回复(0)
我看了一下前面的算法,基本上都是在使用splice之类的方法,改进之处无非是倒着使用避免修改索引i。但是这种方法存在一个问题:比如我们正着来移除相同元素,第一次找到了i=2位置上的数字需要去掉,使用splice操作去除后,再次调用indexOf寻找,之前判断过的结果,比如i=0 i=1位置上的数字还要在判断一次,这个显然是一个很大的冗余,可以计算得到,这样做的复杂度大概是O(N*k),N是数组长度,k是重复量出现的次数,如果考虑的极限一点,k趋近于N,那么~~O(n2)不知道你能不能接受,我是不能~~~所以看到了直接调用现成函数的缺点,不妨动手自己循环一下数组,时间复杂度O(n),和重复次数无关。
function removeWithoutCopy(arr, item) {
    var num = 0;
    for(var i = 0; i< arr.length; i++){
        if(arr[i] !== item && num != i){
            arr[++num] = arr[i];
        }
    }
    arr.length = ++num;
}

编辑于 2017-03-09 20:47:35 回复(1)