首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C语言刷题系列】移除元素

一、问题描述 二、解题思路 在C语言中,原地移除数组中所有等于特定值的元素并返回新长度的问题可以通过双指针法来解决。...一个指针指向数组的写入位置(相当于写指针),另一个指针遍历数组(相当于读指针)。 当遇到不等于给定值的元素时(需要保留的元素),就将该元素复制到写指针所指向的位置,并同时递增两个指针。...当遇到需要移除的元素时,读指针递增,跳过该位置。...int val) { int r = 0;//读指针 int w = 0;//写指针 while (r < numsSize) { if (nums[r] == val)//如果是要删除的元素...,读指针++跳过 r++; else { nums[w++] = nums[r++]; } //如果是要保留的元素,赋值写指针位置,两指针++ } return w;//返回的刚好是有效数字的长度

5410

【C语言】Leetcode 27.移除元素

return dst; // 返回新数组的长度 } 以上代码的主要思路是使用两个指针src和dst,其中src指向原始数组中的元素,而dst指向新数组中的位置。...当src指向的元素不等于目标值val时,将该元素复制到新数组中,并递增dst和src指针;当src指向的元素等于目标值val时,只递增src指针,不进行复制操作。最终返回dst作为新数组的长度。...这段代码的时间复杂度为O(n),其中n为原始数组的长度。由于只遍历一次原始数组,因此效率较高。 二、算法图解 我们设置2为val,src和dst为两个指针。...2 1 2 4 3 1  我们先让两个指针指向数组第一个元素。 由于2是val,所以src++,变成了如下。 1不是val,所以dst指向的2赋值为src所指向的元素,结果如下图。...最终得到的就是dst指针所指向之前的数组元素,返回的数组大小为dst。

7210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言题解 | 移除元素(多种解法)

    前言 这是力扣上的一道简单题,需求是 移除数组中的指定元素,并且要求 空间复杂度为O(1) ,即原地移除,我们可以用顺序表中的任意位置删除的思想解决这个题,符合题目要求,当然还有其他解法。...---- 正文 首先要想清楚移除的本质并不是真删除,而是把元素覆盖即可,覆盖n个元素后,数组总长度就要-n 解法一、逐个判断 解法一是比较容易想到的解法,比较朴素,具体实现起来就是 从头开始遍历,找到目标元素...//27.移除数组 //思路1,一个一个判断 #include void Erase(int* nums, int pos, int len) { //因为题目给的是数组,所以我们要对顺序表的任意删做点改变...} ---- 解法二、分离注入 这个解法也比较容易想到,就是 创建一个额外的 数组 ,对 原数组 进行 遍历判断 ,如果元素不等于 val ,就可以放入 新数组 中,遍历 结束后,需要把 新数组 中的元素注入...两指针相减,得到的是其中间的元素个数 ) //27.移除数组 //思路3,双指针覆盖 #include int removeElement(int* nums, int numsSize

    39640

    移除元素(C++)

    移除元素 给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素,并返回移除后数组的新长度。...不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢?...// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。...你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。...注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

    2900

    数组:啥?要移除我的元素

    我们来解析一下这个题目的做题思路,他的含义就是让我们删除掉数组中的元素,然后将数组后面的元素跟上来。最后返回删除掉元素的数组长度即可。...比如数组长度为10,里面有2个目标值,我们最后返回的长度 为8,但是返回的8个元素,需要排在数组的最前面。那么暴力解法的话则就需要两个for循环,一个用来找到删除,另一个用来更新数组。 ? ?...(1)需要先定义变量len获取数组长度,因为后面我们的返回的数组长度是改变的,所以不可以用nums.length作为上界 (2)我们每找到一个需要删除的值的时候,需要i--,防止出现多个需要删除的值在一起的情况...for循环的上界 int len = nums.length; for(int i = 0; i < len ; i++){ //找到需要删除的元素...if(nums[i]==val){ //覆盖需要删除的元素 for(int j =

    93030

    数组:就移除个元素很难么?

    ❝移除元素想要高效的话,不是很简单! ❞ 编号:27. 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。...不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并「原地」修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。...「你不需要考虑数组中超出新长度后面的元素。」 思路 有的同学可能说了,多余的元素,删掉不就得了。 「要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。」...数组的基础知识可以看这里程序员算法面试中,必须掌握的数组理论知识。 暴力解法 这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。 删除过程如下: ?...size = nums.size(); for (int i = 0; i < size; i++) { if (nums[i] == val) { // 发现需要移除的元素

    1.4K10

    LeetCode刷题(4)【移除元素&合并两个有序数组】(C语言)(含图解)

    移除元素 典型双指针玩法。 27....移除元素 - 力扣(LeetCode) (leetcode-cn.com) ---- 我们都会想到这样的解法:从前面依次往后推,是val就将该数据后面的元素依次覆盖上来,但是这样的时间复杂度是O(n²)...,最坏的结果是一个数组中大部分数据都是val。...所以我们想到另一种解法,以空间换时间 ,另开一个数组,把不是val的数据给新的数组,再把新数组的值拷贝回来。空间复杂度是O(n)。 但是这个题它不让开辟一个新的数组,所以我们还得换一个思路。...——双指针解法 定义两个指针,p1和p2,p1先动,p2后动,如果p1不等于val,就把值传给p2,直到完成一遍遍历,p2的值就是新数组元素的个数。

    35210

    【C 语言】数组 ( 数组相关地址 | 数组首元素地址 | 数组地址 )

    文章目录 一、数组相关地址 1、数组首元素地址 2、数组地址 二、代码示例 一、数组相关地址 ---- 数组首元素地址 与 数组地址 值相等 ; int array[10]; 其中 array + 1...的值是 array 地址 加上 4 字节 ; 其中 &array + 1 的值是 array 地址 加上 40 字节 ; 1、数组首元素地址 数组首元素地址 : 数组名 , 就是 数组元素首地址...; 如 : 在函数中定义 如下 局部变量 , 该数组一旦声明 , 就可以知道这是一个 40 字节的内存 , 已经在 栈内存分配完毕 , 数组的地址肯定就不能修改了 ; int array[10];...2、数组地址 数组地址 : 下面的数组张红 ,&array 是数组的地址 ; int array[10]; 二、代码示例 ---- 代码示例 : #include #include...array[10] = {0}; // 打印数组首元素地址 printf("array : %d\n", array); // 打印数组首元素地址 + 1 printf

    9.6K21

    移除元素

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。...不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢?...// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。...你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。...注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

    16930

    移除元素

    题目 难度级别:简单 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。...不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。...示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。...注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢?...// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。

    1.6K20

    【C 语言】数组 ( 多维数组操作模型 | 取某个数组元素地址 | 取某个数组元素值 )

    文章目录 一、多维数组操作模型 1、取出某个数组元素地址 2、取出某个数组元素值 总结 一、多维数组操作模型 ---- 以 // 声明一个多维数组 int array[2][3]; 二维数组为例...; 1、取出某个数组元素地址 第 0 行 , 第 1 列 元素地址 : array[0] + 1 : array 代表 二维数组首元素地址 , array[0] 是数组首元素值 , 该值是 一维数组..., 数组名是数组首元素地址 , 数组名 + 1 就是第 1 个元素的地址 ; *array + 1 : array 是 二维数组首元素地址 , *array 是二维数组第 0 个元素的值 ,...该值是 一维数组 , *array 一维数组名是数组首元素地址 , *array + 1 步长是一维数组元素大小 , 指向第 1 个元素地址 ; &a[0][1] : a[0][1] 是 第 0...+ j : array 代表 二维数组首元素地址 , array[i] 是二维数组第 i 元素值 , 该值是 一维数组 , 数组名是数组首元素地址 , 数组名 + j 就是第 j 个元素的地址

    6.4K10

    【Leetcode】移除元素、合并两个有序数组

    移除元素 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。...不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢?...// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。...题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。...nums1中,因此,我们可以从后向前比较两个数组元素的大小,将较大的元素依次放在nums1末端。

    11710
    领券