• DS博客作业02--线性表


    1.本周学习总结(0--2分)

    1.1思维导图

    1.2.谈谈你对线性表的认识及学习体会。

    线性表是由n个数据元素组成的有限序列。
    1.线性表的结点可以是单值元素
    2.线性表中的结点可以是记录型元素,每个元素含有多个数据项。
    在学习数据结构线性表使用到很多的指针,和new的内存分配;
    接触了这一段时间的线性表发现链表的很多优点,适合随机的插入和删除操作;
    存储空间大小不需要提前设定,可以进行动态存储。
    这次的pta作业,有很多是书上有的,我们现在还处于理解线性表的过程,理解算法!
    现阶段需要的就是去理解优秀的代码,用于充实我们的知识。

    2.PTA实验作业(6分)

    2.1.题目1:题目名称

    要求实现3个函数,在递增的顺序表中插入一个新整数,并保持该顺序表的有序性。

    2.1.1设计思路(伪代码)

    遍历顺序表,找到位置并且做到顺序插入
    定义 俩个变量 i,j
    循环for i n次、
    if date[i] 大于被插入数x //找到位置
    for j n 到 i 次
    将i位置以后的元素都右移1位
    L->data[i]=x 将数插入

    2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

    2.1.3本题PTA提交列表说明。

    Q1:出现的问题有X的值在第一和最后的时候出错的问题

    2.2 题目2

    已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点。

    2.2.1设计思路(伪代码)

    定义一个p为L的下一个
    统计链表长度 p=p->next
    查找要找的结点
    i=length-m+1;
    返回值 return p->data

    2.2.2代码截图

    2.2.3本题PTA提交列表说明。

    Q1:在DEV上调试的时候,忽略了p指针初始化,查找结点过程并不是很顺利

    2.3 题目3

    设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。

    2.3.1设计思路

    定义所需要的循环变量
    for i n次
    L->data[i]=a[i] 遍历顺序表
    if L->length0 L为空的时候 返回输出error
    else
    for i=1 to L->length 输出L->data[i]
    删除重复数据,数据前移
    for j=L->length-1 to 0
    flag = 0
    for k=j-1 to 0
    if L->data[j]
    L->data[k]
    flag = 1 用于判断是否有重复数据
    while i大等0

            L->data[j++]=a[i--]
    

    2.3.2代码截图

    2.3.3本题PTA提交列表说明。

    Q1:编译问题是发生在变量名打错的缘故
    Q2:一开始没有考虑到空表的情况,出现了错误

    3、阅读代码(-2--2分)

    3.1 题目

    链表的中间结点

           给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
    
           如果有两个中间结点,则返回第二个中间结点。
    

    输入:[1,2,3,4,5]
    输出:此列表中的结点 3 (序列化形式:[3,4,5])
    返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
    注意,我们返回了一个 ListNode 类型的对象 ans,这样:
    ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL

    3.2 解题思路

    方法一:输出到数组
    思路和算法
    按顺序将每个结点放入数组 A 中。然后中间结点就是 A[A.Length/2],因为我们可以通过索引检索每个结点。

    方法二:快慢指针法
    思路和算法
    当用慢指针 slow 遍历列表时,让另一个指针 fast 的速度是它的两倍。当 fast 到达列表的末尾时,slow 必然位于中间。

    3.3 代码截图

    方法一:输出到数组

    方法二:快慢指针法

    3.4 学习体会

    方法一:输出到数组
    时间复杂度:O(N)O(N),其中 NN 是给定列表中的结点数目。
    空间复杂度:O(N)O(N),A 用去的空间

    方法二:快慢指针法
    时间复杂度:O(N)O(N),其中 NN 是给定列表的结点数目
    空间复杂度:O(1)O(1),slow 和 fast 用去的空间。

    一般来说方法一是大家比较普遍的一种做法,但是在代码的优劣性上来讲方法二在时间复杂度不变
    的情况下空间复杂度更低。这一题的代码虽然比较简单,但是给我的影响还是很大的,一个简单的问
    题,用更简洁的方式去优化让代码有了更大的提升。对于一个给定的算法,我们通常要做两项分析:
    第一是从数学上证明算法的正确性,第二就是分析算法的时间复杂度。这一题让我更加懂得去研究一
    种算法是否更加的合理优化。

  • 相关阅读:
    Jquery超简单遮罩层实现代码
    java中Token验证
    基于Token的WEB后台认证机制
    jsp页面数据回显(select下拉选择框)
    ckeditor 绑定事件
    ckeditor 触发事件(案例)
    Linux sed命令学习
    字符串 全排列生成问题
    算法导论第九章 第K顺序统计量
    字符串相似度算法 递归与动态规划求解分析
  • 原文地址:https://www.cnblogs.com/jellysheep/p/10629487.html
Copyright © 2020-2023  润新知