首页 > 试题广场 >

移除数组中的元素

[编程题]移除数组中的元素
  • 热度指数:186731 时间限制: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.includes(item)) {
        arr.splice(arr.indexOf(item), 1)
    }
    return arr
}

发表于 2023-05-05 15:32:38 回复(0)
function removeWithoutCopy(arr, item) {
  for (let i = arr.length - 1; i >= 0; i--) {
    const element = arr[i];
    if (element === item) {
      arr.splice(i, 1);
    }
  }
  return arr;
}

发表于 2023-04-08 00:28:37 回复(0)
function removeWithoutCopy(arr, item) {
   while(arr.indexOf(item) !== -1){
       arr.splice(arr.indexOf(item),1)
   }
    return arr
}
发表于 2023-03-01 19:28:51 回复(0)
function removeWithoutCopy(arr, item) {
 while (arr.indexOf(item) != -1) {
                arr.splice(arr.indexOf(item), 1);
            }
    return arr;
}
发表于 2023-02-03 17:16:50 回复(0)
chrome里是对的 这里编辑器就不对了  
      function removeWithoutCopy(arr, item) {
            var newArr = Array.from(new Set(arr))
            newArr.splice(newArr.indexOf(item),1)
            return newArr
        }

发表于 2022-12-28 19:24:48 回复(0)
// 不用考虑删除后的索引问题,while判断数组中存在删除的元素时,就就splice删除他
function removeWithoutCopy(arr, item) {
    while (arr.includes(item)){
        arr.splice(arr.indexOf(item), 1);
    }
    return arr;
}
发表于 2022-10-08 08:36:39 回复(0)
function removeWithoutCopy(arr, item) {
    // 使用splice()改变原数组,循环遍历解决
    let index = arr.indexOf(item)
    while(index !== -1){
        arr.splice(index,1)
        index = arr.indexOf(item)
    }
    return arr
}
发表于 2022-10-05 21:38:24 回复(0)
function removeWithoutCopy(arr, item) {
    for(let i in arr){
        while(arr[i] == item) arr.splice(i,1)
    }
    return arr
}
发表于 2022-09-30 09:20:46 回复(0)
function removeWithoutCopy(arr, item) {
    var ak = arr;
    var arr = [];
    var b = 0;
    for (var a = 0 ; a < ak.length ; a++){
        if (ak[a] != item){
            arr[b] = ak[a];
            b += 1;
        } else{
            null;
        }
    }
    return arr;
}有没有大牛帮萌新看一下为啥这个过不去

发表于 2022-08-30 20:50:42 回复(0)

<双指针法

function removeWithoutCopy(arr, item) {
    let slow = 0,fast = 0;
    for(;fast < arr.length;fast++){
        if(arr[fast] !== item){
            arr[slow++] = arr[fast]
        }
    }
    arr.splice(slow,fast-slow)
    return arr
}
发表于 2022-07-15 15:02:04 回复(0)
function removeWithoutCopy(arr, item) {
    // splice删除元素方法:
    // splice(index):删除index及之后的所有元素。若 index < 0 , 则删除最后-index个元素,返回删除后的数组
    // splice(index,howmany):删除从index位置开始的数,howmany为删除的个数,若 howmany 小于等于 0,则不删除
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == item) {
            arr.splice(i, 1);
            i--;
        }
    }
    return arr
}

发表于 2022-07-11 20:41:36 回复(0)
function removeWithoutCopy(arr, item) {
    //移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果数组返回
    
    /*存在问题:删掉的位置,后一个元素补上,该元素未进行运算
    arr.forEach((ite,i)=>{
       if(ite==item){
           arr.splice(i,1);
       } 
    });
    return arr;*/
    
    /*法一*/
    for(let i=0;i<arr.length;i++){
        if(arr[i]==item){
            arr.splice(i,1);
            i--;    //避免漏掉下一个元素
        }
    }
    return arr;
    
    /*法二:indexOf():根据字符串找到元素的索引
            判断是否存在相等的元素,存在 则删除。indexOf返回-1,即不存在该元素;不等于-1,则存在该元素 使得其值相等
    */
    while(arr.indexOf(item)!=-1){
        arr.splice(arr.indexOf(item),1);
    }
    

        /*法三*/
    for(let i=arr.length-1;i>=0;i--){
        if(arr[i]==item){
            arr.splice(i,1);
        }
    }
    return arr;
}
据评论总结的方法
发表于 2022-07-08 15:39:37 回复(0)
function removeWithoutCopy(arr, item) {
    var flag=0;
    for(var i=0;i<arr.length;i++){
        if(arr[i]!=item){
            arr[flag]=arr[i];
            flag++;
        }
       
    } 
    arr.length=flag;
    return arr;
}
dbq我真是太菜了orz
发表于 2022-07-03 19:43:47 回复(0)
function removeWithoutCopy(arr, item) {
    arr = arr.filter(e => e !== item)
    return arr
}
为啥这个不行?🤨
发表于 2022-07-02 10:14:54 回复(0)
function removeWithoutCopy(arr, num) {
    return  arr.filter(items=> items !== num )
}
removeWithoutCopy([1, 2, 2, 3, 4, 2, 2],2)
直接es6的filter 过滤掉所有重复的元素,这个方法在编辑器上面操作是有问题的,编辑器的问题,有可能不支持


发表于 2022-05-23 19:11:01 回复(0)
直接filter过滤不行吗?
function removeWithoutCopy(arr, item) {
            arr =  arr.filter(i => i!==item)
            return arr
            }

发表于 2022-05-22 12:59:15 回复(0)

双指针

function removeWithoutCopy(arr, item) {
    let i = 0,j = 0
    while (i < arr.length) {
        if (arr[i] !== item) {
            arr[j++] = arr[i]
        }
        i++
    }
    arr.splice(j)
    return arr
}
发表于 2022-05-17 15:32:50 回复(0)
function removeWithoutCopy(arr, item) {
           for(var i=0;i<arr.length;i++){
               if(arr[i]==item){
                   arr.splice(i,1);
                   i--;
               }
           }
    return arr;
}
var s=removeWithoutCopy([1,2,2,3,4,2,2], 2);
     document.write(s);
发表于 2022-05-12 23:33:44 回复(0)