力扣每日一题(2024.06.19):移除指定元素

78 阅读1分钟

给你一个数组 nums 和一个值 val,你需要nums中移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

示例:

输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2,_,_]
解释: 你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

解析: 实现思路:设置两个指针i,j,分别从数组的两头开始,每一次对比,如果相同,则将当前位置i的数据与数组的指针j的位置的数互换,这样可以保证j指针之后的数据全为要排除的数。

public int removeElement(int[] nums, int val) {
    int i, j;
    for (i = 0, j=nums.length-1; i < nums.length; ) {
        if(nums[i]==val){
            // 如果相等,则将两数交换,但下一次循环时还得从当前位置开始对比
            int t = nums[i];
            nums[i]=nums[j];
            nums[j]=t;
            j--;
        }else{
            i++;
        }

        // i=j时,两个指针相遇,当前位置的数据还需要判断,i>j时意味着j后面的数都是val,不需要再排除了
        if(i>j){
            break;
        }
    }
    return i;
}

欢迎大家指正和讨论!