首页 > 试题广场 >

移除数组中的元素

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

输入

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

输出

[1, 3, 4]
推荐
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) {
    while(arr.indexOf(item)!=-1) {
        arr.splice(arr.indexOf(item),1);
    }
    return arr;
}

发表于 2021-08-16 20:45:48 回复(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)
最多删除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) {
    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) {
    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)
function Copy(arr, i) {
          return arr.indexOf(i) ==-1 ? arr : arr.splice(arr.indexOf(i),1) && Copy(arr,i)
}
编辑于 2017-03-08 23:47:21 回复(0)
function removeWithoutCopy(arr, item) {
    for(i=arr.length-1;i>=0;i--)
      {
       if(arr[i]==item)
         {
                    arr.splice(i,1);
          }
       }
    return arr;
}
倒着检测;不用考虑;位置影响吧
发表于 2015-09-16 15:02:58 回复(34)
把数组看成是队列,等于item元素直接删除,不等于的,先push再删除。
function removeWithoutCopy(arr, item) {
    var n=arr.length;
	 for(var i=0;i<n;i++){
         if(arr[0]!==item)    
             arr.push(arr[0]);
         arr.shift();
          
	}
    return arr;
}

编辑于 2016-06-05 14:44:27 回复(34)
pop()方法:
function removeWithoutCopy(arr, item) {
for(var i=0;i<arr.length;i++){
        if(arr[i]=item){
            arr.pop();
        }
    }
     return arr;
};
发表于 2016-12-26 20:23:40 回复(1)
function removeWithoutCopy(arr, item) {
            for (var i = 0; i < arr.length; i++) {
                if(arr[i] == item) {
                    arr.splice(i--,1);
                }
            }
            return arr;
        }

编辑于 2016-11-10 19:34:54 回复(1)
题目要求在原数组上面直接修改,删除数组元素,可以用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) {
	while(arr.indexOf(item) != -1){
        arr.splice(arr.indexOf(item),1);
    }
    return arr;
}
一个while循环就出来了,判断是否存在,存在了就删掉,不存在return

发表于 2016-08-22 11:25:23 回复(7)
为什么要用i--?直接while不好么
function removeWithoutCopy(arr, item) {
	for(var i in arr){
        while(arr[i]==item){
            arr.splice(i,1);
        }
    }
    return arr;
}
发表于 2016-06-05 00:27:44 回复(4)