移除元素_27_283_26_80

LeetCode_27原题链接:https://leetcode-cn.com/problems/remove-element/

题目描述:

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

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

复制代码
public class removeElement {
    public static int removeElement(int[] nums, int val) {
        if(nums == null || nums.length == 0)  {
            return 0;
        }
        int i = 0;
        for(int j = 0; j < nums.length; j++){
            if(nums[j] != val){
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }

    public static int removeElement2(int[] nums, int val) {
        int left = 0;
        int right = nums.length;
        while (left < right) {
            if (nums[left] == val) {
                nums[left] = nums[right - 1];
                right--;
            } else {
                left++;
            }
        }
        return left;
    }

    public static void main(String[] args) {
        int[] nums = {3,2,2,3};
        int val = 3;
        System.out.println(removeElement(nums, val));
        System.out.println(removeElement2(nums, val));
    }
}
复制代码

LeetCode_283原题链接:https://leetcode-cn.com/problems/move-zeroes/

题目描述:

  给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

  请注意 ,必须在不复制数组的情况下原地对数组进行操作。

复制代码
public void moveZeroes(int[] nums) {
    int n = nums.length, left = 0, right = 0;
    while (right < n) {
        if (nums[right] != 0) {
            swap(nums, left, right);
            left++;
        }
        right++;
    }
}

public void swap(int[] nums, int left, int right) {
    int temp = nums[left];
    nums[left] = nums[right];
    nums[right] = temp;
}


public void moveZeroes2(int[] nums) {
    int n = nums.length;
    int t = 0;
    for(int num: nums) {
        if(num != 0) {
            nums[t++] = num;
        }
    }
    while(t < n) {
        nums[t++] = 0;
    }
}
复制代码

LeetCode_26原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

题目描述:

  给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

       元素的 相对顺序 应该保持 一致 。

       不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

复制代码
public int removeDuplicates(int[] nums) {
    int n = nums.length;
    if (n == 0) {
        return 0;
    }
    int fast = 1, slow = 1;
    while (fast < n) {  // 使用双指针
        if (nums[fast] != nums[fast - 1]) {
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}
复制代码

LeetCode_80原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/

题目描述:

  给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

  不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

复制代码
public int removeDuplicates(int[] nums) {
    int i = 0;
    for (int n : nums) {
        if (i < 2 || n > nums[i-2]) {
            nums[i++] = n;
        }
    }
    return i;
}

public int removeDuplicates2(int[] nums) {
    int n = nums.length;
    if (n <= 2) {
        return n;
    }
    int slow = 2, fast = 2;
    while (fast < n) {
        if (nums[slow - 2] != nums[fast]) {
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}
复制代码

 

posted @   2022年总冠军gogogo  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示