分享一道牛客网上的小题目
移除数组 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 次,确保每个元素都扫描一遍。
一般做完题后我都习惯去查看评论,里面的算法真的是百花齐放啊,值得细细品味一番
下面把其他一些解法汇总一下:
- 持续判断数组元素是否为 item 直到否则前进一步
function removeWithoutCopy(arr, item) {
for (var i = 0; i < arr.length; i++) {
while (arr[i] == item) {
arr.splice(i, 1);
}
}
return arr;
}
- 这个解法的作者有点小错,我稍改了一下,也是一个好方法。循环 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;
}
- 这个方法和上一个方法有点像,也是持续寻找和 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;
}
- 逐个检查数组元素是否等于 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;
}
- 倒着来逐个检查数组元素,不用考虑数组元素删除后导致下标错位的问题
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!