这篇博客记录了我在跟着《算法笔记》以及习题册《算法笔记 上机实践指南》刷了PAT的题目之后的一些解题方法的总结与心得。
这一小节的题目只需根据题目描述(一般规则很简单),用代码实现即可;有些题目在用到一下知识点之后变得更简便。
PAT-B 1001 害死人不偿命的(3n+1)猜想 (15)
PAT-B 1011.A+B和C (15)
PAT-B 1016. 部分A+B (15)
PAT-B 1026. 程序运行时间(15)
PAT-B 1046. 划拳(15)
PAT-B 1008. 数组元素循环右移问题 (20)
PAT-B 1012. 数字分类 (20)
PAT-B 1018. 锤子剪刀布 (20)
PAT-A 1042. Shuffling Machine (20)
PAT-A 1046. Shortest Distance (20)
PAT-A 1065. A+B and C (64bit) (20)
PAT-B 1010. 一元多项式求导 (25)
PAT-A 1002. A+B for Polynomials (25)
PAT-A 1009. Product of Polynomials (25)
在“查找元素”这个小节的题目中,一般会有两种思考的角度:
角度1. 将所有输入读入并保存,遍历所有输入,找到需要查找的元素
角度2. 一边读入一边覆盖,最后保存的就是需要查找的元素
PAT-B 1041. 考试座位号(15)
PAT-B 1004. 成绩排名 (20)
PAT-B 1028. 人口普查(20)
PAT-B 1032. 挖掘机技术哪家强(20)
PAT-A 1011. World Cup Betting (20)
PAT-A 1006. Sign In and Sign Out (25)
PAT-A 1036. Boys vs Girls (25)
图形打印这类题一般有两种做法:
1. 将要输出的内容填充到二位数组中,输出二维数组
2. 直接输出需要输出的东西
法二探索:
对于第二种方法,我认为有三要素:需要打印的行数、需要打印的列数、每行打印的规则。 一旦这三要素确定了,图形基本就出来了。
三要素的获取方法,遇到的两种较多的类型是找规律和数学推算。
法一探索:
对于第一种方法,二维数组的填充,也是通过找到规律,填充进去。这种情况用在每一行的规律不是那么好找的情况下,利用二维数组可随机访问的性质,将信息填入数组,这样就便利得多。题目汇总的第二题有所体现。
类似“沙漏”这种棱角分明的图形规律寻找:
这种图形的规律一般可以拿出边界线(较简单的情况为直线)的直线方程,通过直线方程x,y(控制输出的循环变量)的大小关系来控制输出信息。
如果可以比较容易的看出规律或输出变量之间的关系当然更便捷。
PAT-B 1027. 打印沙漏(20)
PAT-A 1031. Hello World for U (20)
在《算法笔记》中,“日期处理”的问题分类在“入门模拟”章节,解决这类题目不易出错、方便理解的方法也的确是通过“模拟”现实世界的日期更近的情况(时间都是一秒一秒往前走的),来知道代码的实现。
下面题目汇总的第一题有非常好的体现。
codeup 1928 日期差值
新颖的日期比较方法:long long 型数据直接比较法。(这种思想在“查找元素”小节也用到很多)
这一小节的题目比较少且有固定方法可寻,所以当时做完非常开心,忘记记录了,距离今日已经较久远(从家到学校到现在马上要上第二周的课,时间过得真快),当时做题的感受有些记不太清楚,只能凭借题解记录来找回一些做题的记忆志之,日后若有新的收获再记之。
看完题解发现有两点比较关键的:
PAT-B 1022. D进制的A+B (20) → 记录了“进制问题的一般方法”
PAT-B 1037. 在霍格沃茨找零钱(20)
PAT-A 1019. General Palindromic Number (20)
PAT-A 1027. Colors in Mars (20)
PAT-A 1058. A+B in Hogwarts (20)
字符串处理的题目应该算这一章最难的了,可以说这类题目真的是千变万化,没有什么固定思想。需要我非常仔细的观察题目中的输入和输出的通知,还需要注意很多细节以及边界条件,常常是逻辑非常麻烦。
目前这一小节有题目在未解队列里。
PAT-B 1006. 换个格式输出整数 (15)
PAT-B 1021. 个位数统计 (15)
PAT-B 1031. 查验身份证(15)
PAT-B 1002. 写出这个数 (20
PAT-B 1009. 说反话 (20)
PAT-B 1014. 福尔摩斯的约会 (20)
PAT-A 1061. Dating (20)
PAT-B 1024. 科学计数法 (20)
PAT-B 1048. 数字加密(20)
PAT-A 1005. Spell It Right (20)
PAT-A 1001. A+B Format (20)
PAT-A 1035. Password (20)
PAT-A 1077. Kuchiguse (20)
1082. Read Number in Chinese (25) → 入队
这一章运用在题中主要还是sort函数的使用,其中最为重要的是sort函数的cmp函数的编写。
cmp函数的编写有时候需要考虑“分类”这样的概念,比如下面题目汇总的第一题。
cmp函数的编写记忆规律是:若return a < b,则表示左小右大,从小到大排序;a>b则表示从大到小排序。
PAT-B 1015. 德才论 (25)
PAT-A 1062. Talent and Virtue (25)
1016. Phone Bills (25) -> 入队
PAT-A 1025. PAT Ranking (25)
PAT-A 1028. List Sorting (25)
PAT-A 1055. The World’s Richest (25)
PAT-A 1075. PAT Judge (25)
PAT-A 1083. List Grades (25)
PAT-A 1080. Graduate Admission (30) ->有测试点没过
PAT-A 1095. Cars on Campus (30) ->入队
这一章主要涉及到是字符串的散列,并且是简单散列,只需要打一张hashTable就可以。
PAT-B 1029. 旧键盘(20)
PAT-A 1084. Broken Keyboard (20)
PAT-B 1033. 旧键盘打字(20)
PAT-B 1039. 到底买不买(20)
PAT-A 1092. To Buy or Not to Buy (20)
PAT-B 1042. 字符统计(20)
PAT-B 1043. 输出PATest(20)
PAT-B 1047. 编程团体赛(20)
PAT-A 1041. Be Unique (20)
PAT-A 1050. String Subtraction (20)
PAT-B 1005. 继续(3n+1)猜想 (25)
PAT-A 1048. Find Coins (25)
暂且不多说,心累……
看这里。
贪心是一种算法思想。对于贪婪的人类,在想获得“最大利益”的时候,总是需要在每个环节都拿到“最高分”,这就是贪心的本质。所以贪心的思想不难,因为基本贯彻了人的一生;想到贪心的策略,一般也不太难;难点在于对策略的证明。
好在程序中不需要有证明过程,只需要确切保证策略的正确性即可。
PAT-B 1023. 组个最小数 (20)
PAT-B 1020. 月饼 (25)
PAT-A 1070. Mooncake (25)
PAT-A 1033. To Fill or Not to Fill (25)
PAT-A 1037. Magic Coupon (25)
PAT-A 1067. Sort with Swap(0,*) (25)
PAT-A 1038. Recover the Smallest Number (30)
二分查找这么几道题刷了好久……手动哭泣,有几题需要注意的比较多。不过终于是全都AC了,没有进队列了,嘻嘻。
在《算法笔记》中的这一小节,晴神讲了不少东西,题目中遇到了的是两种情况:
1. 二分查找一个数
2. 二分查找一个数,这个数是第一个满足某条件的位置
这两种问题写法上有差别,暂时不记录了,有时间回来记录吧。
刷PAT的时间也马上到头了,有现阶段更加重要和紧急的事情需要处理。撸PAT的这段时间感觉非常好,喜欢~感谢晴神!我一定还会接着刷,以及刷第二遍,第三遍的……
PAT-B 1030. 完美数列(25)
PAT-A 1085. Perfect Sequence (25)
PAT-A 1010. Radix (25)
PAT-A 1044. Shopping in Mars (25)
PAT-A 1048. Find Coins (25)
有了前面的难受,这一节要好很多,并且很多都是之前的题目,two pointers 真是一种强大的思想。
暂且不描述什么是two pointers,从题目中去体会吧。
PAT-B 1030. 完美数列(25)
PAT-A 1085. Perfect Sequence (25)
PAT-A 1089. Insert or Merge (25)
PAT-A 1029. Median (25)
PAT-A 1048. Find Coins (25)
在这一节中,《算法笔记》介绍了:
1. 打表
2. 递推
3. 随机选择算法
其中打表+递归解决了下面“题目汇总”的前两道题,将时间复杂度降到了O(N)。
随机选择算法《算法笔记》(PAT题解)暂时没有对应题目,等遇上题目再总结。主要解决的是“求一个序列中第K大的数”这样的一个问题。
PAT-B 1045. 快速排序(25)
PAT-A 1101. Quick Sort (25)
PAT-B 1040. 有几个PAT(25)
PAT-A 1093. Count PAT’s (25)
这一章的习题(除去小节“大整数运算”)在一年前做的,大部分都做了题解,但是解题之后的感想已经记不得了,所以下面直接给出分类,相信在题解记录中也会找到当时的痕迹。
PAT-B 1003. 我要通过!(20)
PAT-B 1019. 数字黑洞 (20)
PAT-A 1069. The Black Hole of Numbers (20)
PAT-B 1049. 数列的片段和(20)
1104. Sum of Number Segments (20)(同上题)
PAT-A 1008. Elevator (20)
1049. Counting Ones (30)(忘了当时是未解 还是 入队了,总之现在是进入 入队 状态)
在算法笔记中有一题归在此类(1008. 数组元素循环右移问题 (20)),但是这个题目不用书中题解中的思想也能AC。题解记录
分数四则运算相关知识点 请看这里。
PAT-A 1081. Rational Sum (20)
PAT-B 1034. 有理数四则运算(20)
PAT-A 1088. Rational Arithmetic (20)
相关知识点:Eratosthenes筛法求素数表
题解记录:
PAT-B 1007. 素数对猜想 (20)
PAT-B 1013. 数素数 (20)
PAT-A 1015. Reversible Primes (20)
PAT-A 1078. Hashing (25)
相关知识点:质因子分解
题解记录:
PAT-A 1096. Consecutive Factors (20)
PAT-A 1059. Prime Factors (25)
相关知识点: 大整数运算
题解记录:
PAT-B 1017. A除以B (20)
PAT-A 1023. Have Fun with Numbers (20)
PAT-A 1024. Palindromic Number (25)
2017-03-26
这篇博客暂时停更,希望回来接着更新的时候,自己依然是条好汉!!!为自己加油~
ps:《算法笔记》(胡凡 著)是本好书,推荐买来看,哈哈。
2018-01-08
久别快一年了,话不多说,默默更新好了。
先是整理了一下之前刷过的题,有些没有整理进来,打算先刷一段时间,等感觉慢慢回来之后,再将那部分整理进来,现在还是边刷边整理吧~
新的一年,需要更加努力呀~
2018-01-12
整理完了之前没有整理上来的内容(第五章 数学问题)