算法题:27移除元素


给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class Solution {
    public static int removeElement(int[] nums, int val) {

        nums = Arrays.stream(nums)
                .filter((x) -> x != val)
                .toArray();

        
        return nums.length;
    }

    public static void main(String[] args) {
        int[] ints = new int[]{3, 2, 2, 3};
        int ans = removeElement(ints, 3);
        System.out.println("ans = " + ans);
        Arrays.stream(ints).forEach((x)-> System.out.print(x));
    }




}

本想着刚学了一下Java8新特性,想用一下的,可做出来后发现存在问题,这个stream流操作后赋值之后,为什么不能根据地址吧num数组的内容改变呢。

===========================

想了很久,遍历一遍符合就放到前面,第二种解法就是遍历一遍,遇到相同就往后面移动,后面覆盖前面。写的时候不知道哪里出问题了,先姑且就用这种方式吧。

import java.util.Arrays;

class Solution {
    public static int removeElement(int[] nums, int val) {

        int k = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                nums[k] = nums[i];
                k++;
            }
        }

        return k;
    }

 


}

刚刚看别人的题解,原来我这个叫:双指针法,,,花里胡哨。