数据结构题目
嘻嘻嘻嘻
MayObserver
致力于教会 幼稚园 小朋友——什么是算法?
展开
-
1137 Final Grading——结构体set的比较函数+隐式散列思想+四舍五入小技巧
分析大致思路是:输入+处理1;输出+处理2粗处理:注意找到数组最大的边界赋值-1给期中成绩(在线和期末是不需要,原因是在输入时已经筛选了)处理1:输入时;根据输入给的顺序(在线,期中)进行筛选在输入期末时,此时同时计算总评,并插入set进行排序处理2:判断是否总评大于60输出按照期末的递减顺序;若相同,则按照学生id升序排列其他四舍五入:通过对结果+0.5,以保证截断时为四舍五入cmp比较函数必须写到struct中去,同时内部用operati.........原创 2020-07-21 23:10:29 · 125 阅读 · 0 评论 -
1165 Block Reversing——链表题的通解:隐式散列+用二维数组分块
同类型基础题1161-Merging Linked Lists进阶题——分块题1133 Splitting A Linked List分析设置3个下标完全对应的数组(构建隐式散列) 为了快速获得下标,构建map映射 地址——》下标 由于无法获得二维数组恰好的层数,因此采取尽可能大的策略(块3 9/3=3层 10/3=3则需要4层) 层数=quantity/block+1;这样无论如何都不会超出边界 插入二维数组时,按照 块满 ,则层数+1 的方式来累进摆放 同时对于 .....原创 2020-07-21 13:14:59 · 267 阅读 · 0 评论 -
1166 Summit——简单图论
分析Area 1 is OK.——》任意一个点都与剩下点相连;且无剩余点与这些点都相连Area 5 may invite more people, such as 3.——》任意一个点都与剩下点相连 且有剩余点;找到最小的剩余点Area 6 needs help.——》存在1个点与剩下点不相连代码#include<bit...原创 2020-07-21 12:54:32 · 326 阅读 · 0 评论 -
1164 Good in C——筛选字母和字符串矩阵的整行输出
分析将字符串 存放如 7*26的string的二维数组 由于最后的句子 是根据 每个char来找到二维数组中的对应字母 因此用map映射 char和 i (i*7) 由于cout无法识别空格等字符串,因此用getline读入一整行 1层遍历:每个单词 2层遍历:按照7列输出 3层遍历:单词中的字母其他筛选、输出格式 具体看代码代码#include<bits/stdc++.h>using namespace std;vector< vecto...原创 2020-07-21 12:39:30 · 475 阅读 · 0 评论 -
1167 Cartesian Tree——建树和层序遍历
分析给出小顶堆的中序,输出层序因此只需要每次找出序列中最小的,即为父结点代码#include<bits/stdc++.h>using namespace std;struct Tree { int key; Tree* lchild,* rchild; Tree(int x) { key = x; lchild = rchild = NULL; }};int quantity;vector<int>heap_ordered;...原创 2020-07-21 12:16:05 · 253 阅读 · 0 评论 -
1139 First Contact ——和柳神差不多快,但我比她空间占用更少
分析给出关系网;给出任意2个人,得到各自2个同性朋友,且这2个人之间也是朋友进一步分析由于存在 -0000 和 0000 必然用string,因此用到map 建立邻接表 其次由于需要 判断2个人之间也是朋友——》相连为了达到更好的时间效率,因此用map+set建图(别问我怎么知道map+vector不行的)同性判断,因此也只需比较string的长度即可输出时:要求是去绝对值,因此用substr进行截断 其次要求第一个升序,相同时,第二个也升序 因此采用map+set自身有序原创 2020-07-19 01:24:42 · 217 阅读 · 0 评论 -
1140 Look-and-say Sequence——非字符串做法(很一般的做法)
分析遍历序列,记录 连续 相同的数字生成下一个序列(记录 连续 相同的数字)直到递归次数为n具体来说递归由于是参照上一个序列,生成下一个序列,同时作为下一次递归的“参照”所以需要2个vector,递归时交换次序搜索由于数字是固定【0,9】,因此做个数表,找连续 相同的数字,就从数表里搜索其他注意由于不知道最终的序列长度是多少,因此设为尽可能长在测试下,至少要100000(反正我从1000开始测试,测试点6过不去,100000可以)代码#inclu..原创 2020-07-18 14:27:14 · 129 阅读 · 0 评论 -
1145 Hashing - Average Search Time——没有必要为了“短”,降低代码可读性
看了网上太多的答案,大多也是柳神那个版本出来的;讲真那个版本真的适合初学者吗?或许考试这么写没问题,但是丧失了可读性,个人觉得并不是什么“好代码”分析即代码模拟 二次冲突下的散列插入:位置=值%表长+i^2此时位置需落在【0,表长-1】,且插入位置有空间插入搜索搜索时仍需按照二次冲突的方式来遍历直到 比较到 相同值,跳出;或者达到循环上限跳出注:题目是Average Search Time是比较次数,与asl还是不一样的具体实现由于插入和搜索都需要二次冲突来遍历.原创 2020-07-17 14:37:31 · 137 阅读 · 0 评论 -
1144 The Missing Number——散列暴力法
分析数字范围是int;数字数量为10^5;求未给出的最小正整数声明数组空间:10^5+5情况1:数字大小全部在10^5内,直接遍历一遍即可撑死大小也就是10^5+1情况2:数字大小有在10^5 2侧,排除掉2侧的进行遍历此时10^5内必然有更多间隙代码#include<bits/stdc++.h>using namespace std;int quantity;vector<int>hash_table(100005);int m.原创 2020-07-16 14:35:39 · 121 阅读 · 0 评论 -
1147 Heaps——堆判断和静态树后序遍历
分析堆判断部分:参照1155 Heap Paths——DFS堆后序的遍历:形式上与树的后序遍历相同,只不过这里动的是“数组的指针”代码#include<bits/stdc++.h>using namespace std;int times, quantity;bool first{ true };vector<int>sequence;void InPut();void Judge();void Print(int);int main() {原创 2020-07-16 12:27:46 · 186 阅读 · 0 评论 -
1149 Dangerous Goods Packaging——优化时间:set剪枝做法
柳神的处理思路是用散列思想分析给出不合适的货物,要求从给出的各块中判断是否存在不合适货物不合适的货物:建图保存注:此题的不合适货物没有传递性,因此不需要dfs,直接判断即可判断:需要2轮遍历,时间复杂度为n^2(n为货物数量)原因:必须等到货物全部给出才能遍历,不能边给边判断因此剪枝思路是 缩小n的大小货物其中 有合适和不合适货物,因此把合适货物(不在图中的剪掉)具体做法用set的非重复性剪掉代码#include<bits/stdc++.h>#in原创 2020-07-15 16:32:06 · 127 阅读 · 0 评论 -
1155 Heap Paths——DFS
感觉网上太多答案都是完全参考柳神的版本。。。柳神dfs部分可读性其实很一般出彩的是判断大顶堆和小顶堆,非堆的思路,这很值得借鉴分析DFS原理:参考这篇PAT 1130 Infix Expression——什么才是DFS?由“柳神遍历”写法引发的思考判断部分:排除法思路初始化小顶堆和大顶堆为true;一点点排除,发现一个不是则为false原因:小顶堆、大顶堆、非堆三者相互独立我一开始思路:设定2个flag判断 是小顶堆、是大顶堆,来进行前后比较是无法应对来回变化的,..原创 2020-07-15 15:55:56 · 116 阅读 · 0 评论 -
PAT 1151 LCA in a Binary Tree——原理很简单,处理起来很麻烦
分析找得到LCA of 2 and 6 is 3.8 is an ancestor of 1.找不到ERROR: 9 is not found.ERROR: 12 and -3 are not found.找不到——》任意前序/中序搜索即可找得到:LCA of 2 and 6 is 3.分析中序可知:祖先3必在2,6中间分析前序可知:祖先3必在2,6前面因此同时满足上述2点,则说明能找到祖先当不满足时,则说明情况为8 is an ancestor of 1原创 2020-07-14 00:31:08 · 129 阅读 · 0 评论 -
PAT 1150 Travelling Salesman Problem——又是题目表意不清楚
最快解法还行的解法#include<bits/stdc++.h>#pragma warning(disable:4996)#pragma warning(disable:4703)#pragma warning(disable:4700)using namespace std;unsigned int vertex, edge, quantity, pairs, id, min_id, min_dist{ INT_MAX };int x, y, z, first;.原创 2020-07-13 15:17:28 · 114 阅读 · 0 评论 -
PAT 1154 Vertex Coloring——简单图论
分析大致题意:给出图,并给图中的点上色若有2个点相同颜色,则no若无,则输出颜色数量进一步分析查找是否有相同颜色:图的遍历颜色数量:用set不可重复的特性保存颜色代码#include<bits/stdc++.h>using namespace std;int vertex, edge, quantity;bool flag;vector<int>* graph;bool Judge() { int x; map<int,.原创 2020-07-13 13:13:42 · 109 阅读 · 0 评论 -
PAT 1146 Topological Order——考察拓扑题的思想
题目分析代码#include<bits/stdc++.h>using namespace std;vector<int>print, * graph;int vertex, edge, quantity, x, y;bool Judge(vector<int>);int main() { scanf("%d %d", &vertex, &edge); vector<int> indegree;...原创 2020-07-12 23:01:03 · 117 阅读 · 0 评论 -
PAT 1119 Pre- and Post-order Traversals——搞清楚前序和后序生成树是不确定的!
1111原创 2020-07-12 21:29:00 · 114 阅读 · 0 评论 -
PAT 1143 Lowest Common Ancestor——不建树直接上
分析本题需要理清楚一些基础概念:LCA、BST、前序遍历本题的判断可分为2类:能找到: 8 is an ancestor of 7. LCA of 2 and 5 is 3.找不到: ERROR: 9 is not found. ERROR: 12 and -3 are not found.进一步分析:能找到LCA of 2 and 5 is 3.即意味 2和5前面存在一个数,介于2...原创 2020-07-11 16:46:53 · 152 阅读 · 0 评论 -
PAT 1034 Head of a Gang——建图中最快算法(DFS和map+vector)
感谢:iaccepted提供的基础思路原创 2020-07-11 13:50:20 · 144 阅读 · 0 评论 -
PAT 1135 Is It A Red-Black Tree——糟糕的出题
题目代码#include<bits/stdc++.h>using namespace std;#define black 0#define red 1typedef struct node { int color; int key; struct node* lchild, * rchild; node(int x,int y) { key = abs(x); color = y; lchild = rchild = NULL; }}RBTree;int原创 2020-05-25 03:14:32 · 291 阅读 · 0 评论 -
PAT 1138 Postorder Traversal——全网最优解
代码#include<bits/stdc++.h>#pragma warning(disable:4700)#pragma warning(disable:4996)#pragma warning(disable:4703)using namespace std;int quantity{ 0 };vector<int>preorder;vector<int>inorder;void InPut();void PrintPostFirst(int原创 2020-05-25 02:54:16 · 234 阅读 · 0 评论 -
PAT 1086 Tree Traversals Again——手把手教你——(不建树)从先序,中序生成后序
题目地址讲讲3种遍历特点希望能耐心看看,理解下,对于所有的二叉树遍历会有不同的理解先序——》根左右——》打头那个一定是根结点中序——》左根右——》明确根可以区分左右后序——》左右根——》明确根,则旁边肯定是右树说了这么多?有啥用——例子...原创 2020-05-18 23:51:33 · 249 阅读 · 0 评论 -
PAT 1151 LCA in a Binary Tree——与网上大部分解都不同
更快的解法建树中最快的解法#include<bits/stdc++.h>using namespace std;int pairs{ 0 }, quantity{ 0 }, x, y;vector<int>preorder, inorder;map<int, int>pre_id, in_id;void Judge(map<int, int>::iterator, map<int, int>::iterator, int, int原创 2020-06-06 03:05:55 · 165 阅读 · 0 评论 -
PAT 1143 Lowest Common Ancestor——与网上大部分解都不同
#include<bits/stdc++.h>using namespace std;int pairs{ 0 }, quantity{ 0 }, x, y;map<int, int>id;//值——下标vector<int>bst;void Judge(map<int, int>::iterator, map<int, int>::iterator);int main() { scanf("%d %d", &pairs,原创 2020-06-06 02:30:32 · 237 阅读 · 0 评论 -
PAT 1074 Reversing Linked List——双端队列解法
题目地址原始想法既然给定的序列是乱序的;但是输出要求顺序,再按块反转输出那么我为何不直接在读入的时候调整为顺序呢!具体思路读入1个结点后,剩下的结点,仅存在3种情况插在他前面,插在他后面,直接空置(放到另一个容器a里)由于存在空置,因此当输入最后一个时,对容器a进行遍历,再次插入,知道符合题意的首尾通过reverse进行块反转输出时第一个是特殊的,中间是有一定规律的,最后补上-1代码#include<bits/stdc++.h>using namespace st原创 2020-05-17 03:59:40 · 1571 阅读 · 0 评论 -
PAT 1130——
#include<bits/stdc++.h>#pragma warning(disable:4996)#pragma warning(disable:4703)#pragma warning(disable:4996)using namespace std;typedef struct Tree {string key;int lchild;int rchild;}BiTree;string PrintTree(BiTree* T, vector<BiTree*>原创 2020-05-25 03:29:35 · 119 阅读 · 0 评论 -
PAT 1130 Infix Expression——什么才是DFS?由“柳神遍历”写法引发的思考
常见遍历写法或者说书上一般的范例写法此处特指王道,天勤等考研递归写法void PrintTree(BiTree* T) { if (T) { PrintTree(T->lchild); PrintTree(T->rchild); printf("%d ", T->key); }}柳神遍历代码源地址:https://www.liuchuo.net/archives/3798string ans = dfs(root);string dfs(int root原创 2020-06-14 15:16:43 · 290 阅读 · 4 评论 -
PAT Cartesian Tree(2019年冬季考试 )——由二叉排序树到笛卡尔树
原题A Cartesian tree is a binary tree constructed from a sequence of distinct numbers. The tree is heap-ordered, and an inorder traversal returns the original sequence. For example, given the sequence ...原创 2020-04-28 18:53:25 · 271 阅读 · 0 评论