Пожалуйста, сначала проверьте ссылку для получения подробной информации о проблеме.



« Учитывая массив nums и значение val, удалить все экземпляры этого значения на месте и вернуть новую длину. Не выделяйте дополнительное пространство для другого массива, вы должны сделать это, изменив входной массив на месте с помощью **O(1)** дополнительной памяти. Порядок элементов можно изменить. Неважно, что вы оставите за пределами новой длины.

Учитывая `nums = [3,2,2,3], val = 3`, ваша функция должна возвращать length = 2, причем первые два элемента `nums` равны 2. Неважно, что вы оставляете после возвращаемого значения. длина."

Первой мыслью этой проблемы было наивное решение — создать еще один массив для *отфильтрованных* значений. Однако при условии использования памяти. Мы должны изменить входной массив на месте.
На выходе должно быть число N, представляющее *допустимую длину* массива, что означает, что первые N элементов не должны иметь `val`.

Я решил использовать метод двух указателей для решения этой проблемы.
- [ ] Почему?
С двумя указателями `index`, `targetIndex`, `index`, представляющие индекс функции цикла `nums`, и `targetIndex`, представляющий индекс массива результатов, который начинается с 0. Представьте, что вы работаете с новым массивом на основе исходного массива, вы просто перемещаете уточненные значения вперед в новый массив.
В цикле `nums`, если `nums[index]` не равно ` val`, мы перемещаем значения в новый массив, `nums[targetIndex] = nums[index]` и увеличиваем `targetIndex` на 1, чтобы расширить новый массив. Если `nums[index]` равно `val`, мы просто пропускаем перемещение значений, поэтому новый массив будет включать только квалифицированные значения.

```javascript
/**
* @param {число[]} nums
* @param {число} val
* @return {число }
*/
var removeElement = function(nums, val) {
const arrLength = nums.length;
if (arrLength === 0)
вернуть 0 ;
let targetIndex = 0;
for(let index = 0; i ‹ arrLength; index++) {
if (nums[index] !== val)
nums[targetIndex++ ] = nums[index];}
return targetIndex;
};
```