用快慢指针方法比较简单。我的方法是从当前元素swap到后面来实现,其中要考虑到最后复制的位置信息。
快慢指针方法
其中快指针指向不等于val的数组下标 慢指针指向当前新数组(要返回的)下标的位置
javascript
var removeElement = function(nums, val) {
var slowIndex = 0;
for(let fastIndex =0;fastIndex<nums.length;fastIndex++) {
if (nums[fastIndex] !== val) {
nums[slowIndex] = nums[fastIndex]
slowIndex++;
}
}
return slowIndex;
}
我的方法,复制到末尾
javascript
var removeElement = function(nums, val) {
//不改变原数组的长度,只是交换
let currentIndex = 0;
let lastNotEqualToValIndex = nums.length - 1
//考虑到只有一种元素
while (currentIndex <= lastNotEqualToValIndex) {
const current = nums[currentIndex]
if (current === val) {
//swap
//before swap, find the latest not equal val index
while (nums[lastNotEqualToValIndex] === val && lastNotEqualToValIndex > currentIndex) {
lastNotEqualToValIndex--;
}
//console.log('currentindex', currentIndex, lastNotEqualToValIndex)
nums[currentIndex] = nums[lastNotEqualToValIndex]
nums[lastNotEqualToValIndex] = current;
lastNotEqualToValIndex--;
}
currentIndex++;
}
return lastNotEqualToValIndex + 1
};