首页 > 其他分享 >顺序表小小练习题

顺序表小小练习题

时间:2024-11-10 15:19:58浏览次数:3  
标签:练习题 小小 顺序 nums int right 数组 指针 left

在这里插入图片描述

文章目录

前言

上篇博客学习了线性表之顺序表,模拟实现了顺序表的一些功能。
今天小编为大家奉上有关顺序表的一些题目,慢慢食之。

1、移除元素

习题链接:移除元素

题目

在这里插入图片描述
输入与输出示例:
在这里插入图片描述

思路

这里是简单的对数据进行删除,可以用到我们的顺序表。

思路:双指针写法
本题给定一个数组,需要移除所有和val相同的元素。
它是需要移除与val相同的元素之后,其它元素按照原来顺序存在数组中
这里我想到定义两个标记,left和right,都从下标为 0 开始,遍历整个数组,如果遇到等于val的值,right往前走如果遇到不等与val的值,那就left和right一起往前走,直到遍历完整个数组。

代码

int removeElement(int* nums, int numsSize, int val) 
{  			//   left和right 类似于两个指针一样 遇到指定的情况就往前走
    int n = numsSize;
    int left = 0;   //  第一个标记
    for (int right = 0; right < n; right++) 
    {		//  第二个标记
        if (nums[right] != val) 
        {
            nums[left++] = nums[right];
        }
    }
    return left;
}

小小习题,拿下!!
在这里插入图片描述

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

习题链接:删除有序数组中的重复项

题目

在这里插入图片描述
输入与输出示例:
在这里插入图片描述

思路

本题也是对数据的删除,与上个题目相似,但还是有些许差别。

思路: 双指针写法
本题给一个严格递增的数组,需要删除重复出现的元素,使得每个元素出现一次,并且顺序保持一致。
这里是需要删除掉相同的元素,我觉得双指针的方法屡试不爽,我们还是定义两个指针,left和right这一对好兄弟,遍历整个数组,依旧是right走在前面如果遇到和left对应的值相等,right++如果不相等,判断right与left的间隔,如果right刚好是left的下一个,那就left++,继续循环遍历,如果不是下一个,那就把right指向的值赋值给left+1指向的位置,这样遍历下来,left每走一步都是不一样的数值,我们定义的是数组的下标,所以在返回时需要加1才是元素的个数

代码

int removeDuplicates(int* nums, int numsSize) 
{
    int n = numsSize;
    int left = 0;
    for (int right = 1; right < n; right++) 
    {					
        if (nums[right] != nums[left]) 
        {   			//  当right指向的值与left指向的值不相等时,无论哪种情况,left都需要++
            if (right == ++left)  //  此处简写了   left前置++
                continue;
            else 
            {
                nums[left] = nums[right];
            }
        }
    }
    return left + 1;
}

简简单单又是一题 ^ _ ^

在这里插入图片描述

3、合并两个有序数组

习题链接:合并两个有序数组

题目

在这里插入图片描述
输入输出示例:
在这里插入图片描述

思路

这题就看起来有意思了,将两个有序数组变成一个有序数组。

思路:双指针写法
题目给定两个有序的数组,要将其合并成一个数组并放在数组1中,合并之后也依然有序。在合并过程中涉及到了排序的问题,要判断哪一个数据在前。
我们的双指针好兄弟依然登场,这次不同的是,我们定义一个L1指针指向第一个数组的最后一个位置,一个L2指针指向数组二的最后一个位置,说到这里,想必大家都要猜到我要干嘛,我们从后往前插入一个一个比较,哪个大哪个先放到数组1 (这里的数组1可以看成一个新的数组,我们把两个数组的数据合并到一个新的数组)**,因为题目的数组1给定的长度是两个数组长度之和。从数组结尾遍历到最开始,遍历完之后,基本已经排序完毕,数组也合并完毕。
但是还有一个需要处理的点,就是插入数据都有先后顺序,数组二的数据插入完毕,但是数组一还没有完毕,这时又跳出循环,所以我们需要一个善后处理,下面请康康我滴代码。

代码

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
    int index = m + n - 1;
    int l1 = m - 1, l2 = n - 1;   //  定义两个指针,分别指向两个数组的最后位置
    while (l1 >= 0 && l2 >= 0) 
    {
        if (nums1[l1] > nums2[l2])    //  哪个大就先插入哪个,然后对应指针往前走
        {
            nums1[index--] = nums1[l1--];
        } 
        else 
        {
            nums1[index--] = nums2[l2--];
        }
    }
    while (l2 >= 0)  //  善后处理  当数组二没插完时  直接一一赋值过去  
    {
        nums1[index--] = nums2[l2--];
    }
}

有点小难度,但还是拿下!!

在这里插入图片描述

总结

今天完成了有关顺序表的一些习题,完成这些,充分感受到双指针的魅力,双指针的印象又进一步加深。同时,对顺序表的认知也更加清晰,对数组的包装与封装。

最后:
很高兴和大家分享自己的一些 小小习题 以及双指针的魅力。
有什么错误的地方,望指出,小编必然及时改正。

在这里插入图片描述

标签:练习题,小小,顺序,nums,int,right,数组,指针,left
From: https://blog.csdn.net/daily_233/article/details/143659891

相关文章

  • 洛谷题单入门1顺序结构(C语言版)
    【入门1】顺序结构Hello,World!#include<stdio.h>intmain(){printf("Hello,World!");return0;}输出字符菱形#include<stdio.h>intmain(){printf("*\n");printf("***\n");printf("*****\n&q......
  • 数据结构:顺序表(动态顺序表)
    专栏说明:本专栏用于数据结构复习,文章中出现的代码由C语言实现,在专栏中会涉及到部分OJ题目,如对你学习有所帮助,可以点赞鼓励一下博主喔......
  • 线性表——顺序表
    文章目录前言一、顺序表1.1概念与结构1.2分类1.2.1静态顺序表1.2.2动态顺序表1.3动态顺序表的实现总结前言上篇博客入门了数据结构,学习了时间复杂度和空间复杂度,本篇博客学习线性表中的顺序表。线性表是n个具有相同特性的数据元素的有限序列。线性表是⼀......
  • go语言init函数与main函数的执行顺序
    packageschoolimport"fmt"funcinit(){ fmt.Println("school包初始化了")}typeSchoolstruct{}func(s*School)PrintSchool(){ fmt.Println("我是一所学校")}packagehomeimport"fmt"funcinit(){ fmt.Print......
  • 直播短视频系统,Mysql执行顺序代码解析
    直播短视频系统,Mysql执行顺序代码解析MySQL执行顺序FROM<left_table>ON<join_condition><join_type>JOIN<right_table>WHERE<where_condition>GROUPBY<group_by_list>HAVING<having_condition>SELECTDISTINCT<select_list&......
  • 初级数据结构——顺序表
    目录前言一、定义与特点二、类型三、基本操作四、应用场景五、优缺点六、元素插入和删除动态图解插入删除七、代码模板八、使用顺序表的经典例题1.求奇数的乘积代码题解2.数值统计代码题解九、总结结语前言顺序表示最基础的数据结构之一,它也是我们学习开始学习数......
  • Linux基础练习题
    1、截取登录成功界面2、进入用户主目录后切换root用户suroot//输入管理员密码切换到root用户3、在该目录下新建名为teacher和students的文件夹mkdirteacherstudents//使用mkdir创建文件夹ls-a/home/roots//ls-a用于查看是否创建成功4、在teache......
  • 第八章: 8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元
    第八章:8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)思考:1.输入矩阵的值inta[5][5]={0};   inti=0,j=0;   printf("请输入一个5*5的数组:\n");   for(i=0;i<5;......
  • 数据结构学习笔记---线性表:顺序表(插入)
    顺序表的基本操作——插入首先,静态分配一个顺序表#include<stdio.h>#include<stdlib.h>#defineMaxSize5//定义队列的最大长度typedefstruct{ intdata[MaxSize]; intlength;}SqList;然后实现插入方法,for循环我们提前插入了四个元素,顺序排放原理是以i为......
  • 数据库SQL Server语言 练习题合集
    文章目录一、“小学生”题库二、“硕士”题库三、“博士”题库四、“博士后”题库五、“博导”题库六、“校长”题库七、“院士”题库总结1.**多表联接查询**:2.**嵌套查询(子查询)**:3.**去重与计数**:4.**条件筛选与分组**:5.**比较与计算**:6.**实际应用**:总结:一......