我正在努力解决以下问题,
给定一个数组和一个值,删除该值的所有实例并返回新的长度.
我为它编写了下面的代码,但它总是返回一个空数组.
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
for (var i=0; i< nums.length; i++)
{
if (nums[i] == val)
nums.slice(i);
}
return nums;
};
Run Code Online (Sandbox Code Playgroud)
使用数组SPLICE而不是切片
var removeElement = function(nums, val) {
for (var i=nums.length - 1; i >=0; i--) {
if (nums[i] == val) {
nums.splice(i,1);
}
}
return nums.length;
};
var n = [1,2,3,2,1,2,3,2,1];
console.log(removeElement(n , 1));
console.log(n);Run Code Online (Sandbox Code Playgroud)
另外,请注意函数返回nums.length- 正如您所说的要求,函数返回数组的新长度
小智 5
正如其他人所指出的,使用slice根本不会有任何成就.然而,splice正如许多答案所暗示的那样,使用它既低效又不必要,并且会产生尴尬,例如需要向后遍历数组或调整循环索引.
相反,您可以简单地遍历数组,将要保留的元素复制到原始元素之上,使用变量j来跟踪到目前为止我们保留了多少项.然后我们调整数组的长度(并返回它,因为这是规范):
// Filter an array in place, removing elements equal to some value.
var removeElement = function(nums, val) {
for (var i=0, j=0; i< nums.length; i++) {
if (nums[i] !== val) nums[j++] = nums[i];
}
return nums.length = j;
};
Run Code Online (Sandbox Code Playgroud)
但是,此代码仅用于过滤特定条件,即元素不等于某个特定值.编写一般的"就地过滤"功能会更有用:
// Filter an array in place, based on a condition.
function filterInPlace(arr, condition) {
let j = 0;
for (let i = 0; i < arr.length; i++)
if (condition(arr[i], i, arr)) arr[j++] = arr[i];
return arr.length = j;
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以解决原来的问题如下:
// Remove a particular value from an array, in-place.
function removeElement(nums, val) {
return filterInPlace(nums, function(value) { return value !== val; });
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们设计condition了与(val, index, array)传递给函数相同的签名Array#filter,以防万一,即使这里没有使用最后两个参数.
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |