顺序表算法题

在学习了顺序表专题后,了解的顺序表的结构以及相关概念后就可以来试着完成一些顺序表的算法题了,在本篇中将对三道顺序表相关的算法题进行讲解,希望能对你有所帮助,一起加油吧!!!


1.移除元素

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

在本题中通过以上题目说明,题目要求我们实现的代码是能将数组中的值为val的值都删除

例如以下数组

在删除都为2的元素后数组就要变为以下形式,而除了留下的元素其他的元素值变为什么我们不关心

因此要解决这道题就要像以下定义两个变量str和tmp一开始都为数组下标0 ,之后通过str遍历数组,如果str的数组下标位置的值不为val,将数组下标str的值赋值给数组下标tmp的位置并且tmp和str都加一,如果str的数组下标位置的值为val就只str加一

例如以下就是一个数组使用以上方法删除值为2元素的开始和最终的图示

cpp 复制代码
//在这题目给的函数内,函数的参数nums为指向数组的整型指针,nunsSize为数组的元素个数
//val为要删除的元素的值
int removeElement(int* nums, int numsSize, int val) 

解题代码 :

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

2.删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣(LeetCode)

在看完以下题目的描述后就可以知道题目要我们实现的代码功能是将数组中的重复元素删除

例如以下数组示例

数组在删除重复元素就变为以下形式

因此要解决这道题就要像以下定义两个变量dest一开始为数组下标0src一开始为数组下标1若数组dest下标位置的值不等于数组下标src位置的值就先将dest加一,之后将下标src位置的值赋值给下标为dest位置的值,之后再将src加一;若数组dest下标位置的值等于数组下标src位置的值就只将src加一

例如以下就是一个数组使用以上方法删除重复元素的开始和最终的图示

cpp 复制代码
//在这题目给的函数内,函数的参数nums为指向数组的整型指针,nunsSize为数组的元素个数
int removeDuplicates(int* nums, int numsSize) 

解题代码 :

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

3.合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode)

在通过以上题目描述后就可以了解到题目要求我们是将两个有效数组合并,并且要将两个合并后的数组保存到第一个数组中,保存到数组的数据是递增的。第一个数组的元素个数一开始就为合并后的总个数

例如以下数组示例

要实现这题中两个有效数组的合并就先定义变量l1为第一个数组的有效元素的最后一个下标,定义变量l2为第二个数组的末尾,定义变量l3为第一个数组的末尾,之后比较l1和l2位置的值将这两个当中大的值插入到l3的位置当中,之后l3减-1并且l1-1或者l2-1。最终在l1或者l2小于0时就停止以上的操作,这时如果是l1先为0就说明第二个数组还有元素未进入到第一个数组当中,这时就要循环将元素导入第一个数组当中

例如以下示例

最终合并完两个数组后变为以下形式

cpp 复制代码
//在这题目给的函数内,函数的参数nums1为指向第一个数组的整型指针,m为第一个数组有效元素个数
//数nums2为指向第二个数组的整型指针,n为第二个数组有效元素个数
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)

完整代码:

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=m+n-1;
    while(l1>=0&&l2>=0)
    {
        if(nums1[l1]>nums2[l2])
        {
            nums1[l3--]=nums1[l1--];
        }
        else
        {
            nums1[l3--]=nums2[l2--];
        }
    }
    while(l2>=0)
    {
        nums1[l3--]=nums2[l2--];
    }
}
相关推荐
Fanxt_Ja19 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
2303_Alpha20 小时前
SpringBoot
笔记·学习
萘柰奈20 小时前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽20 小时前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫20 小时前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
今后12320 小时前
【数据结构】二叉树的概念
数据结构·二叉树
向阳花开_miemie21 小时前
Android音频学习(十八)——混音流程
学习·音视频
小莞尔21 小时前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
工大一只猿21 小时前
51单片机学习
嵌入式硬件·学习·51单片机
小莞尔21 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机