要求

给定一个数组和一个值,原地移除数组内所有值等于给定值的元素,并返回新数组的长度

思路

遍历数据过程中遇到等于目标值就直接跳过,不等于目标值就赋值

须知

1.数组生成的那一刻就已经定义好了他的内存大小,无法删除内部的某一位置的元素,只能覆盖。内存中长度不变
2.双指针法 核心在于偏移和赋值的先后顺序

常规解法

public function removeElement()
{
    $val = 3;
    $array = [3,2,2,3];
    $num = 0;
    foreach ($array as $k => $v) {
        if ($val == $v){
            unset($array[$k]);
        }
        $num++;
    }
    return $num;
}

双指针解法

public function removeElement1()
{
    $val = 2;
    $array = [0,1,2,2,3,0,4,2];
    $num = count($array);
    if ($num<=1)return $array;
    $slow = 0;
    for ($fast=0;$fast<$num;$fast++){
        if ($array[$fast] != $val){
            if ($slow != $fast) {
                $array[$slow] = $array[$fast];
            }
            $slow++;
        }
    }
    return  $slow;
}