[leetCode]27.移除元素

在这里插入图片描述

解法一 暴力法

定义一个指针i指向nums第一位,向后遍历,如果遇到nums[i]=val则将nums[i]之后的元素整体向前移动一位

class Solution {
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        int i = 0;//定义一个i指针指向数组第一位
        for(; i < len;){
            if(nums[i] == val){//如果当前元素为val,将当前元素之后的元素向前移动
                for(int j = i; j < nums.length - 1; j++){
                    nums[j]=nums[j+1];
                }
                len--;
            }else{//i++,得在这里控制i++
                i++;
            }
        }
        return len;
    }
}

解法二 双指针法

定义一个快指针j与慢指针i,一开始指向首元素。如果nums[j]==val,则递增j跳过该元素,如果nums[j]!=val则将nums[j]赋值给nums[i]

class Solution {
    //双指针法
    public int removeElement(int[] nums, int val) {
        int i = 0;//指向数组首元素
        //j最开始指向首元素
        for(int j = 0; j < nums.length; j++){
            //j++跳过nums[j]=val的元素,
            if(nums[j]!=val){
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }
}

解法三 双指针法 --移除较少元素

当遇到 nums[i] = valnums[i]=val 时,可以将当前元素与最后一个元素进行交换,并释放最后一个元素。这实际上使数组的大小减少了 1。

class Solution {
    //双指针法 --移除较少元素
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        int i = 0;//定义一个i指针指向数组第一位
        while(i < len){
            if(nums[i] == val){//如果当前元素为val,将最后一个元素赋值给当前元素
                nums[i]=nums[len-1];
                len--;
            }else{//i++,得在这里控制i++
                i++;
            }
        }
        return len;
    }
}
posted @ 2020-06-21 09:57  消灭猕猴桃  阅读(66)  评论(0编辑  收藏  举报