【C++】大厂算法题(详解)

本篇博客给大家带来的是用C++语言写的合并两个有序数组、移除元素、删除有序数组的重复项算法。

🐟🐟文章专栏:C++

🚀🚀若有问题评论区下讨论,我会及时回答

❤❤欢迎大家点赞、收藏、分享

你们的支持就是我创作的动力

今日思想:既然认准一条道路何必去打听要走多久!!

一、合并两个有序数组

方法:谁大放谁回后面

题目描述:

图片解疑:

两种情况:

情况一:

上面图是第一种情况:num1的数据都大于num2的数据,当然我们假设这两个数组的数据如上。如果num1l1<num2l2就让num1l3=num2l2;放完之后l2和l3都要减一。统称为谁大放谁到num1的后面。这时你会发现会把num2的数据全都放到num1的后面,l2已经小于0了,这时num1就是一个有序的数组,无需更改。l1没变

情况二:

num1数组的数据大于num2数组的数据,按照谁大放谁回num1后面的原则,我们会发现num1的数据全都放回到最后面,l1已经小于0了,num2数组的数据没用到,所以我们用个循环就把num2的数据放到num1的前面。

代码实例:

cpp 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int l1=m-1;
    int l2=n-1;
    int l3=n+m-1;
    while(l1>=0 && l2>=0)
    {
        if(nums1[l1]<nums2[l2])
        {
            nums1[l3--]=nums2[l2--];
        }
        else
        {
            nums1[l3--]=nums1[l1--];
        }
    }
    if(l1<0)
    {
        while(l2>=0)
        {
            nums1[l3--]=nums2[l2--];
        }
    }
}

二、移除元素

方法:双指针

题目描述:

图片解疑:

我们定义两个变量分别为sor、dest。如果nums dest !=val;那么nums sor =nums dest ,dest和sor都要加一。 如果等于的话只让dest加一。这时候sor等于2,返回sor就行。

最后结果:

代码实例:

cpp 复制代码
int removeElement(int* nums, int numsSize, int val) {
    int sor=0;
    for(int dest=0;dest<numsSize;dest++)
    {
        if(nums[dest] != val)
        {
            nums[sor++]=nums[dest];
        }
    }
    return sor;
}

三、 删除有序数组的重复项

方法:双指针

题目描述:

图片解疑:

我们让sor=0;dest=1;如果numsdest=numssor,dest++;不等话sor++,numssor=numsdest

然后再dest++;着时候前sor+1的数据是不同的,所以返回sor+1就行。

最后的结果:

代码实例 :

cpp 复制代码
int removeDuplicates(int* nums, int numsSize) {
    int sor=0;
    int dest=1;
    while(dest<numsSize)
    {
        if(nums[dest]==nums[sor])
        {
            dest++;
        }
        else
        {
            sor++;
            nums[sor]=nums[dest];
            dest++;
        }
    }
    return sor+1;
}

可化简为:

cpp 复制代码
int removeDuplicates(int* nums, int numsSize) {
    int sor=0;
    int dest=1;
    while(dest<numsSize)
    {
        if(nums[dest]!=nums[sor])
        {
            sor++;
            nums[sor]=nums[dest];
        }
            dest++;

    }
    return sor+1;
}

特殊情况:

在这种情况中会重复赋值,所以如果numsdest!=numssor,然后sor++之后在判断sor是否不等于dest,如果不等让nums sor =nums src ;这样就可以避免重复赋值。

代码如下:

cpp 复制代码
int removeDuplicates(int* nums, int numsSize) {
    int sor=0;
    int dest=1;
    while(dest<numsSize)
    {
        if(nums[dest]!=nums[sor])
        {
            if(++dest != src)
           {

            nums[sor]=nums[dest];
           
           }
        }
            dest++;

    }
    return sor+1;
}

可优化代码为:

cpp 复制代码
int removeDuplicates(int* nums, int numsSize) {
    int sor=0;
    int dest=1;
    while(dest<numsSize)
    {
        if(nums[dest]!=nums[sor] && ++dest != src)
        {
            nums[sor]=nums[dest];
        }
      dest++;

    }
    return sor+1;
}

完!!

相关推荐
2401_872418786 小时前
算法入门:数据结构-堆
数据结构·算法
王老师青少年编程6 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践1)
c++·csp·高频考点·信奥赛·提高组·搜索剪枝·小木棍
石山代码7 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言
程序大视界7 小时前
【Python系列课程】Python正则表达式(下):环视、命名分组与日志实战
开发语言·python·正则表达式
xwz小王子7 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
枫叶v.8 小时前
Agent 分层存储架构设计:从记忆方法到中间件选型
开发语言·python
黎阳之光8 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
Black蜡笔小新9 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手9 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
sleven fung9 小时前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain