【数组】5 种方法实现移除元素【力扣27】

152 阅读1分钟

题目描述见链接 力扣第 27 题 力扣链接

我是个笨人,想到的第一种方法如下:

第一种

int removeElement(int[] arr, int removeValue){
    List<Integer> list = new ArrayList<>();
    for (int i : arr) {
        if(i != removeValue){
            list.add(i);
        }
    }
    for (int i = 0; i < list.size(); i++) {
        arr[i] = list.get(i);
    }
    return list.size();
}

提交情况:有点费内存...

image.png


但我又不甘做笨人,于是 参考资料后又琢磨了下面四种方法:

第二种:用双指针的方式

int removeElement(int[] nums, int val) {
    int slow = 0;
    for (int fast = 0; fast < nums.length; fast++) {
       if(nums[fast] != val){
           if(slow != fast){
               nums[slow] = nums[fast];
           }
           slow++;
       }
    }
    return slow;
}

第二种方法的执行情况:比第一种的内存消耗少了些...

image.png


第三种:在第二种方式的基础上 变成了递归的方式

public int removeElement(int[] nums, int val) {
   return removeElement11(nums, 0, 0, val);
}

private int removeElement11(int[] arr, int slow, int fast, int removeValue){
    if(fast >= arr.length){
        return slow;
    }
    if(arr[fast] != removeValue){
        arr[slow] = arr[fast];
        return removeElement11(arr, slow + 1, fast + 1, removeValue);
    }else{
        return removeElement11(arr, slow, fast + 1, removeValue);
    }
}

执行情况:

image.png


第四种:也是双指针 但是双向奔赴 两个指针分别位于前和后双向奔赴...

public int removeElement(int[] nums, int val) {
  int left = 0;
    int right = nums.length - 1;
    while (left <= right){
       if(nums[left] != val && nums[right] != val){
           left++;
           continue;
       }
       if(nums[left] == val && nums[right] == val){
           right--;
           continue;
       }
       if(nums[left] != val && nums[right] == val){
           left++;
           right--;
           continue;
       }
       if(nums[left] == val && nums[right] != val){
           nums[left] = nums[right];
           left++;
           right--;
           continue;
       }
    }
    return left;
}

执行结果:

image.png

第五种:在第四种的基础上,改成递归

public int removeElement(int[] nums, int val) {
    return removeElement(nums, 0, nums.length - 1, val);
}

private int removeElement(int[] arr, int left, int right, int removeValue){
    if(left > right){
        return left;
    }
    if(arr[left] != removeValue && arr[right] != removeValue){
        return removeElement(arr, left + 1, right, removeValue);
    }else if(arr[left] == removeValue && arr[right] == removeValue){
        return removeElement(arr, left, right - 1, removeValue);
    }else if(arr[left] != removeValue && arr[right] == removeValue){
        return removeElement(arr, left + 1, right - 1, removeValue);
    }else{
        //  arr[left] == removeValue && arr[right] != removeValue
        arr[left] = arr[right];
        return removeElement(arr, left + 1, right - 1, removeValue);
    }
}

运行结果:

image.png


~~END~~