PAT
PAT计算机程序设计题解(JAVA版)
东方旅行者
世上无难事,只要肯登攀。
展开
-
PAT部分较难题目JAVA答案总结
PAT部分较难题目题解原创 2019-12-03 20:58:42 · 768 阅读 · 1 评论 -
PAT刷题遇到的坑
String类型比较时不用“==”,使用.equals方法!原创 2020-01-16 10:39:42 · 160 阅读 · 0 评论 -
PAT甲级1155 Heap Paths(JAVA版)
本题考查堆的数组存储,大根堆小根堆,树的深度优先遍历思路直接用一维数组存储堆,利用关系可以模拟树的深度遍历结点对应数组下标某树根结点i该根结点左子树的根结点2*i+1该根结点右子树的根结点2*i+2AC代码import java.util.Scanner;public class Main { static int[] heap; sta...原创 2020-03-12 10:46:33 · 159 阅读 · 0 评论 -
PAT甲级1151 LCA in a Binary Tree(JAVA版)
本题考查二叉树,最深公共祖先LCA思路版本一思路:每次模拟建树过程找到该迭代对应的先序遍历数组与中序遍历数组版本二思路:比版本一省去了数组,直接用数组元素下标表示该迭代对应的遍历数组,并且使用map存储对应元素在中序遍历当中的位置,便于确定查找的两结点相对于现阶段根结点的位置。若a和b在根结点的左边,则a和b的最近公共祖先在当前子树根结点的左子树寻找,如果a和b在当前子树根结点的两边,...原创 2020-03-10 12:06:12 · 168 阅读 · 0 评论 -
PAT甲级1148 Werewolf - Simple Version(JAVA版)
本题考查逻辑?思路题目要求按照顺序输出狼人编号,所以按照顺序对每一个穷举情况进行判断。判断的思路:isHuman数组存储该用户的身份,1代表人类,-1代表狼从头开始对每一个用户的发言进行判断,若该用户所指定的角色与isHuman的角色不符(arr[i]*isHuman[Math.abs(arr[i]) - 1] < 0),则说明该用户说谎,将该用户的角色(isHuman[i])...原创 2020-03-09 16:41:54 · 135 阅读 · 0 评论 -
PAT甲级1147 Heaps(JAVA版)
本题考查堆,二叉树后序遍历思路本体只要知道堆一般使用一维数组存储就很好做数组与堆对应二叉树的关系(数组下标从0开始):二叉树对应数组下标根index左子树根结点2*index+1右子树根结点2*index+2根据以上关系即可将递归后序遍历代码改为使用数组下标的递归代码注意:本题判断大根小根堆与是否是堆三种情况使用布尔类型会造成不变,所以使用整...原创 2020-03-09 10:38:54 · 140 阅读 · 0 评论 -
PAT甲级1146 Topological Order(JAVA版)
本题考查图的拓扑排序思路思路一:建立存储结点入度的数组,每次判断都为有一条起点为该点的边的终点入度减一思路二:建立存储结点前驱节点的数组,每次判断当前队列是否包含该结点所有的前驱结点PS:本题并不困难,写在这里主要想提醒自己,本体需要判断的序列一定长度为6,不管该序列是不是拓扑排序序列都需要读完这几个数,不能提前退出,所以在判断该队列不属于拓扑排序后不能跳出循环,还需要继续将剩下几个数读...原创 2020-03-09 09:43:14 · 162 阅读 · 0 评论 -
PAT甲级1145 Hashing - Average Search Time(JAVA版)
本题考查二次探查思路只要弄明白什么是二次探察就很简单二次探察:二尺探查属于开放定址法,开放定址法与二次探察一般公式如下:注意,一般新建哈希表都会指定哈希表的长度,并且该长度最好是质数注意,判断质数的函数循环一定是for(int i = 2 ; i <= Math.sqrt(num) ; i++)不是for(int i = 2 ; i < Math.sqrt(num) +...原创 2020-03-08 18:39:52 · 168 阅读 · 2 评论 -
PAT甲级1143 Lowest Common Ancestor(JAVA版)
本题考查二叉搜索树,树的先序遍历思路其实这个三十分的大题挺简单的,写在这里是为了提醒自己以下内容:因为题目给定二叉树的先序遍历,而且要求找到两结点的最深祖先节点,所以需要从前往后进行遍历,而且二叉搜索树是按照结点键值顺序进行构造的,所以可以直接按照先序遍历顺序找到符合条件的结点的结点即可。条件是:该结点键值大于等于给定两键值中较小的一个,小于等于两键值中较大的一个。代码import ...原创 2020-03-08 11:51:49 · 143 阅读 · 0 评论 -
PAT甲级1135 Is It A Red-Black Tree(JAVA版)
本题考查红黑树、树的深搜、树的广搜思路红黑树简介:https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91因为红黑树也是二叉搜索树,所以可以根据先序遍历顺序与元素相对大小构建树,然后使用BFS对每个元素进行判断,是否符合红黑树条件。题目给了红黑树的五个条件:Every node is either red or black....原创 2020-03-03 11:07:28 · 572 阅读 · 1 评论 -
PAT甲级1131 Subway Map(JAVA版)
本题考查图的深度遍历思路参考柳神代码代码import java.util.HashMap;import java.util.Scanner;import java.util.Vector;public class Main { static Vector<Vector<Integer>> g; static HashMap<Integer, ...原创 2020-03-02 17:00:55 · 213 阅读 · 0 评论 -
PAT甲级1130 Infix Expression (JAVA版)
本题考查中序遍历,中缀表达式思路在输出中缀表达式有以下四种情况该结点有左孩子,有右孩子输出“(左孩子中序遍历结果 + 自己 + 右孩子遍历结果)”该结点有左孩子,无右孩子该情况不输出该结点无左孩子,有右孩子输出“(自己 + 右孩子遍历结果)”该结点无左孩子,无右孩子输出“自己”,不加括号另外,总表达式外面是不需要加括号的,所以需要判断一下总表达式外面是否有括号,有的话删...原创 2020-02-29 15:53:40 · 127 阅读 · 0 评论 -
PAT甲级1115 Counting Nodes in a BST(JAVA版)
本题考查二叉搜索树的建立与层序遍历思路很简单,写下博客的原因是提醒自己注意构建二叉树时的返回值,递归函数一层一层返回,若不返回的话,无法成功修改二叉搜索树//别忘了调用函数返回的值要赋给rootpublic void add(int key) {root = add(key, root);}private Node add(int key, Node r) { if(r == nul...原创 2020-02-21 15:19:47 · 131 阅读 · 0 评论 -
PAT甲级1103 Integer Factorization(JAVA版)
本题考查DFS,剪枝优化思路第一步,按照给定次数,将从1开始所有小于等于给定数字的数加入数组Vector,例如给定3次方,给定数字100,则数组Vector中有{1,8,27,64}第二步,递归地从大到小将数组Vector中的数字加入临时数组temp中,因为元素可以重复,所以递归地下一层的指示数组Vector下标的索引不变,递归过程记录临时数组中的元素个数,并记录临时数组内元素的总和(便于...原创 2020-02-19 11:54:17 · 205 阅读 · 0 评论 -
PAT甲级1014 Waiting in Line
本题考查队列思路首先时间用从上午八时开始的分钟数表示,输出结果时再进行处理;需要建立题目给定个数的队列,且队列规模小于等于题目给定规模;如何模拟顾客出对入队?最开始,按照最大限度将所有队列填充顾客,使每个队列达到能达到的最大顾客数,注意本体要求若多条队列人数相同,顾客按照队列顺序入队,所以只需要按照下标依次入队即可。下一步就是模拟服务,遍历每个队列,从多条队列中选出剩余服务时间最短的队...原创 2020-02-17 16:35:18 · 210 阅读 · 0 评论 -
PAT甲级1099 Build A Binary Search Tree
本题考查二叉搜索树思路给定二叉搜索树结构,给定二叉搜索树中所有结点键值,将这些键值插入,并输出层序遍历结果。重点就是根据二叉搜索树结构插入键值,根据二叉搜索树左子树元素小于根结点,右子树元素大于根结点,可以确定假设左子树有L个结点,右子树有R个结点,则根结点就是已经排好序的候选键值中的第L+1个。得到以上结论,接下来的重点就是计算一个结点左右子树的结点数,可以使用递归的方法计算子树结点数,...原创 2020-02-16 15:28:14 · 126 阅读 · 0 评论 -
PAT甲级1087 All Roads Lead to Rome
本题考查C++可以用迪杰斯特拉算法加深度优先遍历,但JAVA如果使用上述的话一定会超时,所以只能用迪杰斯特拉算法解决。思路传统迪杰斯特拉算法仅计算距离。但该题需要考虑“乐趣程度”、“平均乐趣程度”、“相同距离的路径数”。在计算平均乐趣程度时,我犯了一个错误,我错误地将平均值记作前几个数平均值加上新的数再除以2,这样计算是错误的,正确的计算方法应该是前几个数平均值呈上前几个数的个数加新数除...原创 2020-02-13 19:39:40 · 163 阅读 · 0 评论 -
PAT甲级1086 Tree Traversals Again
本题考查二叉树、中序遍历思路思路一句话:“根据二叉树中序遍历非递归代码生成二叉树并对其进行后序遍历”如何根据二叉树中序遍历非递归代码生成二叉树?建立两个变量preCal与pre分别记录上一次操作的类型与操作的结点索引。分两种情况讨论:如果当前操作是“push”的话 1. 如果上一次的操作是push,则本次push结点是上个操作结点的左孩子 2. 如果上一次的操作是pop,则本...原创 2020-02-13 15:01:04 · 128 阅读 · 0 评论 -
PAT甲级1085 Perfect Sequence(JAVA版)
本题考查逻辑?我也不知道,反正思路有点动态规划的意思,因为有点“最大限度利用之前问题的答案作为基础解决后面的问题”的意思解析代码思路就是从0索引开始,左索引与右索引都为0,若满足条件,右索引++,直到不满足条件,此时左索引++,继续判断,但注意“此时右索引并不重置为左索引相等的数值”,因为右索引表示的是左索引还没有加1之前的最大元素的索引,当左索引加一时,题目给定条件一定仍然满足,因为M&l...原创 2020-02-13 10:12:41 · 111 阅读 · 0 评论 -
PAT甲级1082 Read Number in Chinese(JAVA版)
本题考查字符串处理思路除了0之外数字1-9分别对应其小写拼音,另外当“数组长度 - 数字所在数组索引”单位9Yi8、4Qian7、3Bai6、2Shi5Wan当该位等于0如果“数组长度 - 数字所在数组索引”等于5,需要输出“Wan”,另外将每从个位其每四位看作一个小组,出现零时,当零右边小组内元素没有非零元素时,零不输出,如...原创 2020-02-12 15:31:03 · 169 阅读 · 0 评论 -
PAT甲级1066 Root of AVL Tree(JAVA版)
本题考查AVL树分析AVL树详细解析直接实现一个AVL树,插入所有节点后,读取根节点key值。提醒一下自己,递归函数返回值是第一层函数的返回值,而不是下面几层。AC代码import java.util.ArrayList;import java.util.Scanner;public class Main { //用于存储层序遍历结果 static ArrayList<...原创 2020-02-07 18:20:16 · 177 阅读 · 0 评论 -
PAT甲级1064 Complete Binary Search Tree(JAVA版)
本题考查二叉搜索树、完全二叉树解题思路一个重要的规则:二叉搜索树的中序遍历满足结点权值从小到大排列完全二叉树最底层结点由左向右排列首先有现有结点数计算根结点索引,然后对左子树递归该方法,对右子树递归该方法。根节点索引根据左右子树结点个数来确定,首先计算以根节点的树中有几层是完整的,然后计算底层结点数,根据关系,即可得出根节点索引,子树递归时方法相同。AC代码import java....原创 2020-02-07 10:58:37 · 153 阅读 · 0 评论 -
PAT甲级1057 Stack(JAVA版)
本题考查树状数组树状数组解析树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构,其原理:A为正常数组,C为树状数组,A与C的元素有以下关系:C1 = A1C2 = A1 + A2C3 = A3C4 = A1 + A2 + A3 + A4C5 = A5C6 = A5 + A6C7 = A7...原创 2020-02-05 20:21:26 · 233 阅读 · 0 评论 -
PAT甲级1059 Prime Factors (JAVA版)
本题考查埃氏筛分析JAVA代码第一个用例会提示内存超限,但从C++运行结果看,这几个用例规模应该差别不大,不知道为啥JAVA代码第一个用例会超限。埃氏筛:从最小的质数2开始,将2的倍数设为非质数标志,然后3…,之后的循环当该数字没有非质数标志时则把其倍数添加非质数标志。质因数分解:从最小的质数开始,并将当前质数设为prime,用待分解的数字num除以prime,若整除,则继续num除以p...原创 2020-02-05 16:11:21 · 174 阅读 · 0 评论 -
PAT甲级1053 Path of Equal Weight (JAVA版)
本题考查树的深度优先遍历思路利用迭代方式实现DFS,并通过函数参数传递路径与路径权值的变化情况。因为题目要求结果需要排序,将结果存入ArrayList中,并编写一个比较器进行排序。最开始的一般我直接用String的排序方法,结果有一个用例没通过,分析得知是因为String的排序方法有一些漏洞比如说:“123”、“99”进行比较时,后者要大于前者,因为String是按照字符进行比较的。所以...原创 2020-02-04 10:37:10 · 327 阅读 · 0 评论 -
PAT甲级1051 Pop Sequence(JAVA版)
本题考查栈算法思路总体思路:根据出栈序列,入栈,直到其当前栈顶元素等于出栈元素;如果所有元素均入栈后,都无法使得当前栈顶元素与出栈元素相同,停止压栈顺序:1,2,3,4,5,6,7输出顺序:1,7,6,5,4,3,2当栈为空时,压栈。比较栈顶元素与输出顺序当前指定元素是否相同,相同出栈,若不相同则将下一个元素压栈。程序结束的标志:输出顺序全部元素都已经遍历到压栈顺序中全部元素...原创 2020-02-03 18:40:29 · 183 阅读 · 0 评论 -
PAT甲级1045 Favorite Color Stripe(JAVA版)
本题考查动态规划问题(LCS算法)动态规划介绍动态规划的核心就是:根据之前已经解决的子问题的解来求解父问题,换句话说“先解决子问题,再由子问题解决父问题”动态规划实例:《算法导论》钢管切割问题详细的动态规划介绍可以参考https://blog.csdn.net/u013309870/article/details/75193592LCS最长公共子序列问题介绍从两个序列A与B中找到...原创 2020-02-02 17:30:47 · 188 阅读 · 0 评论 -
PAT甲级1044 Shopping in Mars(JAVA版)
本题简单解析考察所谓的“二分查找”,但我使用JAVA实现二分查找的方法,AC时竟然比先前自己写的代码通过的测试点还少。以下是代码运行时间的比较:测试用例(PAT标准用例1):16 153 2 1 5 4 6 8 7 16 10 15 11 9 12 14 13版本运行时间自己写的版本15295904300ns自己写的版本21823066099ns根...原创 2020-02-01 21:20:17 · 250 阅读 · 0 评论 -
PAT甲级1040 Longest Symmetric String(JAVA版)
本题考查动态规划,可以使用Manacher(马拉车)算法,该算法能够将查找最长回文的时间复杂度降低到O(n)。思路:很简单,就是马拉车算法,但是马拉车算法比较难理解。我自己看了很多大神的解析渐渐明白了一些东西,总结一下就是一句话:“马拉车算法的核心思想就是利用回文对称的性质,使用以前计算的每个字符的回文半径作为关于回文中心对称的字符的回文半径基础值,以便减少时间复杂度”。在以上条件不满足(即没有...原创 2020-01-31 17:43:31 · 204 阅读 · 0 评论 -
PAT甲级1043 Is It a Binary Search Tree(JAVA版)
本题考查二叉搜索树的构建,与树的先序遍历、后序遍历。思路:按照二叉搜索树规则构建二叉树,对该树进行先序与镜像先序遍历,若两个顺序的其中一个与题目给的相符,则输出YES,并输出其后序遍历结果。代码:import java.util.Scanner;public class Main { public static void main(String[] args) { S...原创 2020-01-31 17:30:28 · 228 阅读 · 0 评论 -
PAT甲级1001JAVA答案
PAT甲级1001JAVA解析在这里插入代码片原创 2019-12-03 21:07:36 · 628 阅读 · 1 评论