LeetCode27.移除数组元素

LeetCode:27.移除数组元素


27. 移除元素 - 力扣(LeetCode)

数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

1.暴力方法

思路:*暴力遍历原数组进行数组元素删除操作*

  1. 外层循环遍历原数组找寻数组值等于val的元素的下标
  2. 内层循环遍历找到的下标的后面所有的元素使其向前移动一位便可删除等于val的数组元素

注意:这道题使用暴力的易错点在于:

  • 我们每次删除完一个元素后i需要从前一个位置开始往后遍历数组,否则会默认第i个下标元素值一定不是val。而事实上我们每个元素都已经往前移动了一位,因此i也需要向前移动一位

  • 内层循环的遍历我们需要注意放置数组越界,因此注意循环条件为j < numsSize -1

//  暴力解法
int removeElement(int* nums, int numsSize, int val) 
{
    int i =0;
    //  遍历原数组找寻数组值等于val的元素的下标
    for(i=0;i<numsSize;i++)
    {
        if(nums[i] == val)
        {
            //  覆盖删除
            int j = i;
            for(j = i;j<numsSize-1;j++)
            {
                nums[j] = nums[j+1];
            }
            numsSize--;
            i--;
        }
    }
    return numsSize;
}

2.双指针

双指针思路节省一层循环

定义快慢指针,快指针寻找不重复的元素,慢指针为我们原地更新的新数组下标,当每次找到一个不重复的元素后我们将快指针指向的元素赋值给慢指针所在位置。

int removeElement(int* nums, int numsSize, int val)
{

	if (numsSize > 0)
	{
		int tmp[numsSize];
		int i = 0;
		int j = 0;
		for (i = 0; i < numsSize; i++)
		{
			if (nums[i] != val)
			{
				tmp[j] = nums[i];
				j++;
			}
		}
		for (i = 0; i < j; i++)
		{
			nums[i] = tmp[i];
		}
		return j;
	}
	else
	{
		return 0;
	}
}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jamo@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值