顺序表算法题

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


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--];
    }
}
相关推荐
for_ever_love__7 分钟前
Objective- C学习: 手动内存管理
c语言·学习·ios·objective-c
gechunlian889 分钟前
Spring Security 官网文档学习
java·学习·spring
闻哥18 分钟前
MySQL InnoDB 缓存池(Buffer Pool)详解:原理、结构与链表管理
java·数据结构·数据库·mysql·链表·缓存·面试
罗湖老棍子28 分钟前
简单题(信息学奥赛一本通- P1539)
数据结构·算法·树状数组·区间修改 单点查询
2401_8534482330 分钟前
Maix例程代码学习
学习
FPGA小迷弟39 分钟前
FPGA工程师面试题汇总(二)
学习·fpga开发·verilog·fpga
西西弟1 小时前
常见排序算法集合(数据结构)
数据结构·算法·排序算法
小龙报1 小时前
【数据结构与算法】栈和队列的综合应用:1.用栈实现队列 2.用队列实现栈 3.设计循环队列
c语言·数据结构·数据库·c++·redis·算法·缓存
重生之我是Java开发战士1 小时前
【广度优先搜索】队列:N叉树的层序遍历,二叉树的锯齿形层序遍历,二叉树的最大宽度,在每个树行中找最大值
数据结构·算法·leetcode·广度优先
Aurorar0rua1 小时前
CS50 x 2024 Notes C - 01
c语言·学习方法