js在原数组上移除特定元素的各种算法

分享一道牛客网上的小题目

移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
测试样例:removeWithoutCopy([1, 2, 2, 3, 4, 2, 2], 2);

我的答案:

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;
}

解析:先判断数组的第一个元素是否与 item 相等,如果是则向数组尾部复制该元素,随后不管判断是对是错,都将第一个元素删除掉。重复循环此过程 arr.length 次,确保每个元素都扫描一遍。

一般做完题后我都习惯去查看评论,里面的算法真的是百花齐放啊,值得细细品味一番
下面把其他一些解法汇总一下:

  1. 持续判断数组元素是否为 item 直到否则前进一步
function removeWithoutCopy(arr, item) {
	for (var i = 0; i < arr.length; i++) {
		while (arr[i] == item) {
			arr.splice(i, 1);
		}
	}
	return arr;
}
  1. 这个解法的作者有点小错,我稍改了一下,也是一个好方法。循环 arr.length 次,每次都找和 item 相同的元素下标,然后利用 splice 删除(如果下标结果为-1则不删除)
function removeWithoutCopy(arr, item) {
	var len = arr.length;
	for (var i = 0; i < len; i++) {
		var a = arr.indexOf(item);
		if (a != -1) arr.splice(a, 1);
	}
	return arr;
}
  1. 这个方法和上一个方法有点像,也是持续寻找和 item 相同的元素的下标,当 flag 结果为 false 时,持续终止。
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;
}
  1. 逐个检查数组元素是否等于 item 等于则删除(此方法算是最符合人一开始思考的思路了吧),因为当符合条件减掉一个元素时,后面的元素都会前移,因此需要 i 减 1,以便下次循环再次检查此位置的元素(也就是上一轮下标为 i +1 因为元素被删除而往前移下标变成了 i 的那个元素)
function removeWithoutCopy(arr, item) {
     for(var i = 0; i < arr.length; i++){
         if(arr[i] == item){
             arr.splice(i,1);
             i--;
         }
     }
     return arr;
 }
  1. 倒着来逐个检查数组元素,不用考虑数组元素删除后导致下标错位的问题
function removeWithoutCopy(arr, item) {
	var len = arr.length;
	for (var i = len - 1; i >= 0; i--) {
		if (arr[i] == item) arr.splice(i, 1);
	}
	return arr;
}

好了,分享完毕
希望你我都有所收获~ Yes!

发布了20 篇原创文章 · 获赞 6 · 访问量 4030

猜你喜欢

转载自blog.csdn.net/CanMoHaiYan/article/details/105319862