题目
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度,不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组,元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
我们这里使用for循环结合splice的方法进行实现,我们进去就对出参nums进行循环,在循环中使用if语句进行判断当前循环中出参nums的值是否与出参val相等,如果相等则对出参nums使用splice方法,将当前循环中的值从出参nums中截取出去,并将当前循环中用于获取nums值的i变量进行自减1,如果不相等则将i变量自增1,循环完成之后将当前出参nums长度返回出去即可
/** * @param {number[]} nums * @param {number} val * @return {number} */ var removeElement = function(nums, val) { for(var i=0 ; i < nums.length;){ if( nums[i] == val){ nums.splice(i,1) i-- }else{ i++ } } return nums.length; };
我们这里还可以使用倒序的方式实现,使用for循环的方式对出参nums进行循环,循环变量i初始值是出参nums的长度减1,每次循环进行i--,在循环中,我们声明一个el变量,我们每次循环都对出参nums使用pop方法,获取出参nums的末尾值并赋值给el变量,然后使用if语句进行判断,当前el变量值和出参val是否相等,如果不相等则将当前的el变量值,通过unshift方法重新插入到出参nums中,当循环结束后,直接返回出参nums的数据长度
/** * @param {number[]} nums * @param {number} val * @return {number} */ var removeElement = function(nums, val) { for(let i = nums.length - 1; i >= 0; i--) { let el = nums.pop(); if(el !== val) { nums.unshift(el); } } return nums.length; };