顺序表算法题

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


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--];
    }
}
相关推荐
我要出家当道士11 分钟前
Nginx单向链表 ngx_list_t
数据结构·nginx·链表·c
最后一个bug25 分钟前
STM32MP1linux根文件系统目录作用
linux·c语言·arm开发·单片机·嵌入式硬件
林的快手28 分钟前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
FeboReigns29 分钟前
C++简明教程(4)(Hello World)
c语言·c++
FeboReigns30 分钟前
C++简明教程(10)(初识类)
c语言·开发语言·c++
虾球xz31 分钟前
游戏引擎学习第59天
学习·游戏引擎
从以前43 分钟前
准备考试:解决大学入学考试问题
数据结构·python·算法
枫零NET1 小时前
学习思考:一日三问(学习篇)之匹配VLAN
网络·学习·交换机
.Vcoistnt1 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
沐泽Mu1 小时前
嵌入式学习-QT-Day07
c++·qt·学习·命令模式