最全LeetCode每日一刷 --- 拿捏顺序表经典面试题,C C++面试你必须要知道的那些知识

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

**法一:**依次挪动数据进行覆盖

从第一个数据开始进行依次遍历,如同示例1,依次遍历数组,找到移除的元素2就把后面的数据往前挪动进行覆盖,如图所示:

此法有个缺陷,题目中明确指出使用空间复杂度O(1)的方法解决此问题,而此法的空间复杂度刚好为O(1),可以解决,不过考虑周全些,时间复杂度在情况最坏时为O(N2),出现全是val的情况,将会挪动n-1+n-2+……出现了等差数列,时间复杂度为O(N2),此法不是最优,换。

**法二:**双指针1.0

依次遍历原数组,看是不是val,把不是val的值,拷贝到新数组,此法的时间复杂度是O(N),空间复杂度也是O(N),可是题目明确指出空间复杂度要为O(1),所以此法不行,但是仔细想想,如果继续用此法双指针,但是不另开数组,就在原数组上改动可否呢?,由此引出双指针2.0

**法三:**双指针2.0

此法是在法二的基础上进行的升级,法二需要开辟额外数组,此法直接原数组改动。首先定义两个变量src和dst为0,都作为数组nums的下标,依次遍历src看nums[src]是否为val,若不是,将其赋给下标dst,再src++,dst++。若nums[src]=nums[dst],则只把src++,dst不动,最后再把长度dst返回即可。

  • 代码如下:
int removeElement(int* nums, int numsSize, int val){
    int dst=0;
    int str=0;
    while(str<numsSize)
    {
        if(nums[str]==val)
        {
            str++;
        }
        else
        {
            nums[dst]=nums[str];
            dst++;
            str++;
        }
    }
    return dst;
}
2、删除有序数组中的重复项
  • 链接直达:

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

  • 题目:

  • 思路:

双指针(不额外开数组)

此题和上题类似,同样可以采用双指针,并在原数组进行改动,只需要定义两个变量dst和src作为数组nums的下标,但此时做出小变动,把src从下标1开始,而dst从下标0开始。让nums[src]每次和它前一个也就是nums[src-1]相比较,如果相等,则src++,若不等就把nums[src-1]赋给nums[dst],再dst++,src++。

注意:

执行完上述操作后,还存在一个问题,那就是没把src的最后一个下标的值放到nums[dst]里头去,就如同本题的示例,当src走到倒数第二个值3的时候,和前一个3相等,此时需要++src,现在nums[src]就是4,和前一个值不相等,把3赋给nums[dst],此时src再++到空了,没有数据和4比较了,越界,所以4就漏掉了。在如同当后面2个数字同为3的时候,因为一直相等,src同样+到空,3同样漏掉,所以无论哪种情况,都要把最后一个数字移到nums[dst]上

  • 画图演示:

  • 代码如下:
int removeDuplicates(int* nums, int numsSize){
    int dst=0;
    int src=1;
    while(src<numsSize)
    {
        if(nums[src]==nums[src-1])
        {
            src++;
        }
        else
        {
            nums[dst]=nums[src-1];
            dst++;
            src++;
        }
    }
    nums[dst]=nums[numsSize-1];
    dst++;
    return dst;
}

3、合并两个有序数组
  • 链接直达:

合并两个有序数组

  • 题目:

  • 思路:

**法一:**memmove + sort排序(冒泡、qsort等)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

5%以上C C++开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值