• DS博客作业02线性表


    1.本周学习总结

    1.1思维导图

    1.2认识及学习体会

    这章内容总体感觉并不难,基本设计思路和链表的做法挺像的,但是顺序表与数组的做法会更相似一点。在查找元素方面,顺序表是比链表更方便的,但在删除和插入元素上,链表的优势则很明显,顺序表需要移动数组,在时间复杂度上会更大一些,链表则创建或删除一个节点就可以。此次对链表的学习,知道还有头插法这种做法,那么使链表的逆序输出就变得非常方便。
    

    2.PTA实验作业

    2.1.题目1:顺序表删除重复元素

    2.1.1设计思路

            定义变量i,j,k         //i,j用于查找元素,k用于记录重构顺序表的下标
    	定义变量flag判断该数是不是重复元素
    	for i = 0   to  i < L->length
    	      给flag赋值为1,后面如果碰到重复数则改为0,然后不放入重构的顺序表
    		for  j = 0  to  j < k   //和已存入新表的元素进行比较
    			if (下标为j对应的数据大于下标为i的)
    				flag = 0;
    				break;
    			end if
    		end for
    		if (flag) 将下标为i的数据存入重构的顺序表,并让k自增
    	end for
    	k的值就是重构的顺序表的长度
    

    2.1.2代码截图

    2.1.3本题PTA提交列表说明。

    Q:在编译器运行的时候,总是不能把所有的数据输出来
    A:一开始理解错了重构,第二个for循环并不能起到删除完重复数据的作用,改用将该数和已存入重构表中的数据比较即可

    2.2 题目2:链表倒数第m个数

    2.2.1设计思路

    	定义指针p,q并让L->next的地址给他们
    	定义变量count记录链表的长度,并赋初值为0
            if(m<0)位置不合法,直接返回-1
    	while (p不为空)//计算链表长度
    		p 指针往下移
    		count++
    	end while
            if(count=0)空表,返回-1
    	定义变量 k = count - m+1表示正数第k个位置
    	if (k表示的位置在链表长度合理范围内)
    		for ( i = 1 to  i <= k)
    			if (i == k) q对应位置上的数据
    			q指针往下移
    		end for
    	end if
    	else 返回-1
    

    2.2.2代码截图

    2.2.3提交列表

    Q1:第一次两个位置无效都错误
    A1:没有考虑m表示的位置不合法的情况
    Q2:第二次还是有一个位置无效的测试点过不了
    A2:一直以为是返回-1出了问题,后面发现是p和q应该指向L的next而不是L
    Q3:上问中有效位置没错而无效位置却有问题
    A3:第一个循环多走了一步,而后面的循环少走了一步导致有效位置是对的,而无效位置则有问题了

    2.3 题目3:有序表插入数据

    2.3.1设计思路

    创建链表
    插入数据 
    	定义变量 i 和 k    //k记录下x需要插入的位置
    	while (i < L->length)
    		if (需要插入的数不大于第i个位置上的数)
    			break;
    		end if
    	end while
    	找到插入位置,length长度加一
    	for (k = L->length - 1  to  k > i)//移动元素
    		将下标为k-1的数的值赋给下标为k的数
            end for
    	将x的值插入到下标为 i 的位置
    输出链表
    

    2.3.2代码截图

    2.3.3提交列表

    Q1:出现编译错误
    A1:把语言编译器改为c++即可
    Q2:顺序表为空的时候答案错误
    A2:忘记讨论空表输出ERROR的情况了

    3、阅读代码

    3.1 题目

    判断一个链表中是否有环,是则返回 true,否则返回 false
    

    3.2 解题思路

    定义快慢指针,如果有环,最终快慢指针会在非空区域相遇
    注:用到fast->next前先要确保fast不为空,要用fast->next->next前先要确保fast,fast->next不为空
    复杂度:时间O(n), 空间O(1)
    代码思路:fast指针一次性移动两次,slow指针一次性移动一次,如果有环的话,两个指针则最终会指向同一位置
    

    3.3 代码截图

    3.4 学习体会

    - 感觉编程也有不少数学的应用,善用数学思想,可以大大简化代码
    - 通过搜索网站了解到更多自己还不知道的知识点,掌握多点知识
    
  • 相关阅读:
    BestCoder Round #32
    USACO Runaround Numbers
    USACO Subset Sums
    USACO Sorting a Three-Valued Sequence
    USACO Ordered Fractions
    USACO 2.1 The Castle
    Codeforces Round #252 (Div. 2)
    Codeforces Round #292 (Div. 2)
    BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
    BZOJ 1603: [Usaco2008 Oct]打谷机
  • 原文地址:https://www.cnblogs.com/zhonghaiqing/p/10577617.html
Copyright © 2020-2023  润新知