记录所学、所为、所闻、所见、所思、所感。

涉及内容包括但不限于专业编程技术、人人都能用上的IT知识、日语学习、保险普及、运动知识、好物推荐、读书记录、……

「Python|aiohttp|并发与协程」将HTTP请求提速成百上千倍!一次性掌握把requests请求改成协程的通用方法

本文主要介绍如何通过使用aiohttp库将同步的http请求改成异步方式请求,从而降低等待网络IO过程中时间和计算资源的浪费。主要包括如何将常见的requests请求改用aiohttp异步执行以及如何将异步的批量请求方法封装成普通方法/同步调用方式,给业务模块调用。

「PAT乙级真题解析」Basic Level 1100 校庆 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定了一组校友ID, 然后给定了一组来宾ID, 要求输出是校友的来宾中, 最年长的一位。 如果来宾中没有校友, 则输出来宾中最年长的一位。 由于涉及到查询, 所以本题的重点在于数据的存储与查询。ID是由数字和大写字母组成, 所以需要存储成字符串。 查询时的比较可以使用字符串比较函数。 同时为了性能考虑, 可能先对要查询的校友ID进行排序, 然后查询时使用二分查找。 进一步性能考虑, 存储最值时可以存储最年长校友在数组中的索引而不是直接存储字符串, 避免多次字符串拷贝。

「PAT乙级真题解析」Basic Level 1090 危险品装箱 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一组不相容的数值对, 然后给定多组数值, 要求检查每组数值中是否存在不相容的数值对。 所以本题的核心是数据的存储, 然后循环进行数据查询和比对。 如果使用的编程语言有哈希表和集合的数据结构, 可以直接将编号作为哈希表的键, 使用集合作为值来存储与其不相容的数值。 C语言中, 需要用数组存储, 然后手动遍历数据来实现"检查元素是否在集合中"。

「PAT乙级真题解析」Basic Level 1102 教超冠军卷 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一组销量和单价, 要求计算出销量最高的商品以及销售总额最高的商品。 因为本题要求计算最值, 所以显然是一道最值题, 需要做的就是数据存储与比较(/统计)。 因为只求最值, 给出的ID唯一(即不存在商品数据合并的操作), 所以只需要储存目前的最值, 然后每次新数据进来进行比较即可, 比当前最值小的数据不需要存储。

「PAT乙级真题解析」Basic Level 1080 MOOC期终成绩 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目给出了三批数据, 分别代表编程成绩, 期中考和期末考成绩。 要求按照给定的公式计算加权总分, 便且给出总分不低于60分的学生信息。 所以, 我们需要做的就是数据存储, 然后进行数据计算, 然后挨个检查进行输出。 由于不同数据是在不同批次给出的, 而且同一个学生代表不同项目成绩需要绑定在一起, 所以涉及到以ID作为唯一标志, 查询ID, 如果ID相同, 则更新该ID下对应的项目成绩。

「PAT乙级真题解析」Basic Level 1110 区块反转 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定链表头节点地址, 总节点个数, 区块大小, 要求按照指定方式以区块为单位, 反转链表中的区块顺序。 指定方式为: 按照给定区块大小将链表划分为不同区块, 然后将区块逆序, 区块内元素相对顺序不变。 由于该题是通过输入校验, 所以如果在考试中, 为了追求更快获得正确解, 可以选择直接按照指定方式输出各个节点信息的方式。 比如: 将各个链表元素按照连接顺序放入连续的数组中, 然后按照给定长度划分区块, 最后直接从最后一个区块往第一个区块的顺序,按照要求输出。

「PAT乙级真题解析」Basic Level 1075 链表元素分类 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定链表头节点地址, 总节点个数, 元素分类阈值, 要求按照指定的方式对链表元素进行分类排序。 指定方式为: 将元素的值按照"大于0", "大于等于0且小于等于给定阈值", "大于给定阈值"分为三组, 分组中的元素保持在原始链表中的相对顺序, 最后按照指定格式输出分类排序后的各个节点信息。 由于该题是通过输入校验, 所以如果在考试中, 为了追求更快获得正确解, 可以选择直接按照指定方式输出各个节点信息的方式。 比如: 将各个链表元素按照连接顺序放入连续的数组中, 然后给定规则对数组元素进行排序, 最后直

「PAT乙级真题解析」Basic Level 1025 反转链表 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一个链表头, 总节点个数, 反转长度, 要求按照指定方式反转链表。 指定反转方式为: 按照给定的反转长度将链表分组, 反转每一组里的元素(如果最后一组元素不足则不反转) 注意, 需要每一组反转后的末尾元素连接下一组反转后的首个元素。 由于该题是通过输入校验, 所以如果在考试中, 为了追求更快获得正确解, 可以选择直接按照指定方式输出各个节点信息的方式。 比如: 将各个链表元素按照连接顺序放入连续的数组中, 然后按照划分反转好每一个元素, 最后直接按照要求输出。

「PAT乙级真题解析」Basic Level 1105 链表合并 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定两个链表头, 总的节点数目, 要求将两个链表按指定方式合并。 指定合并方式为: 每两个长链表元素后要插入一个短链表元素, 直到短链表元素插入完毕则得到合并后的链表。 由于该题是通过输入校验, 所以如果在考试中, 为了追求更快获得正确解, 可以选择直接按照指定方式输出各个节点信息的方式。 比如: 整理好两个链表之后, 每输出两个长链表元素, 就输出一个短链表元素, 如果短链表输出完毕, 则直接输出长链表元素直到输出完毕。

「PAT乙级真题解析」Basic Level 1085 PAT单位排行 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定了一组学生的信息(准考证号, 得分, 学校), 要求以学校为单位, 统计每个学校的考生人数以及加权总分。 然后将统计结果按照分数排名, 按照排名由高到低输出各个学校的排名、名称、加权总分和考生人数。 所以过程主要分为统计(数据存储)和排序输出两个部分

「PAT乙级真题解析」Basic Level 1089 狼人杀-简单版 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定假设狼人杀中N名玩家有2人是狼人, 有2名玩家说的不是实话, 只有一个狼人说谎。要求计算出扮演狼人的玩家。 题目的重点在于身份的确认和发言真假的确认。 因为题设固定了狼人的数量只有2个, 所以我们需要从N名玩家中假设2个玩家是狼人, 其余玩家就都认为是好人, 身份的确认就完成了。 发言真假确认通过题设给定的规则, 如果发言认为某人是狼人且该玩家确认是狼人, 则为真; 或者认为某人不是狼人且该玩家确实不是狼人, 则为真; 其余都为假。 最后只需要检查 全部谎言的数量是否为2 且 狼人说谎的数量是否为1

「PAT乙级真题解析」Basic Level 1104 天长地久 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求给定一个位数K, 一个各位数字之和m, 要求满足条件的A. 需要满足的条件是: A+1的各位数字之和n与给定的m的最大公约数是一个大于2的素数。 题目就是有点绕, 其他还好。 最容易想到的方式就是穷举进行条件检测, 但是会有性能问题, 比如测试点5对穷举的作答就会提示运行超时。

「PAT乙级真题解析」Basic Level 1094 谷歌的招聘 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一串数字串以及一个位数, 要求找出最早出现的长度等于指定位数, 且数值为素数的数字串。 所以最直觉的方法就是从数字串第一位开始, 截取指定位数的数字串, 然后检查其代表的数值是否是素数。 如果是素数则输出该数字串, 如果遍历完毕都没有符合条件的数字串, 则输出"404"。

「PAT乙级真题解析」Basic Level 1074 宇宙无敌加法器 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定三个字符串, 第一个字符串代表各个数位的进制数, 第二个和第三个字符串代表十进制数值(题目说是PAT数, 但是当成十进制数处理就可以)。 要求将两个数值相加之后按照给定的各个数位进制进位之后, 输出相加结果。 由于给定的两个数位数不一定相同, 所以我们需要高位补零让两个数值位数相同, 然后从末尾开始往最高位, 按位相加然后进位计算两数之和。

「PAT乙级真题解析」Basic Level 1109 擅长C (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定26个英文字母的输出格式, 然后给定几个单词(由非大写英文字母隔开), 要求用给定的输出格式输出这些英文单词。 那么事情就简单了, 如果我们只看后半部分的话, 那基本就相当于`if char == 'A': print('A')`的级别了, 只是现在给定了各个英文字母的输出格式, 所以是`if word == "HELLO": print(指定格式("HELLO"))`。 所以重点在于将指定的输出格式存储下来, 然后在最后检查英文句子的时候输出.

「PAT乙级真题解析」Basic Level 1108 String复读机 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求将给定的字符串按照"String"的顺序输出, 并且忽略"String"之外的字符。 同时说明了"String"中6个字符出现的频次不保证相同, 输出时若某种字符已输出完毕, 则跳过该字符. 所以, 我们要做的是统计"String"中各个字符在给定的字符串中出现的次数作为要输出的个数, 然后按照"String"的顺序循环检查每一个字符当前的剩余个数, 如果不等于0, 则输出并将次数减一, 直到这6个字符的剩余个数都为0为止。

「PAT乙级真题解析」Basic Level 1101 B是A的多少倍 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设明确要求按照其给定的步骤变换给定的正整数, 然后输出变换后的正整数是输入正整数的多少倍。 所以重点在于转换逻辑的编写。由于给定的正整数不大于10的9次方, 所以可以用整型存储。 但是涉及到部分数位的移动, 使用整型时获取各个数位的数字时需要从后往前, 这里不太适合, 所以最佳方式时使用字符串存储正整数, 变换之后得到新的字符串, 然后将两个字符串转换为整型后相除。

「PAT乙级真题解析」Basic Level 1098 岩洞施工 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定了岩洞中每一个位置的顶部高度和底部高度, 要求判断是否能够将一个单位的长管道水平送入岩洞中。 由于是水平送入, 所以只需要判断顶部的最低位置和底部的最高位置之间的距离是否大于长管道的宽度。 由于题设给定长管道为1个单位宽, 所以我们只需要求出顶部的最低位置, 底部的最高位置, 检查二者差是否大于1即可。

「PAT乙级真题解析」Basic Level 1005 继续(3n+1)猜想 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目提出一个新概念"关键数", 并给出其定义: 在进行(3n+1)猜想时, 不会出现在其他给定数值的计算过程中的, 就是关键数。 这意味着, 如果我们要计算给定的一组数中, 哪些数是关键数, 则需要对这些数进行(3n+1)猜想的计算, 然后记录计算过程中出现的各个数, 等到完全计算完毕后与给定的数值进行对比, 得到差异即可。

「PAT乙级真题解析」Basic Level 1092 最好吃的月饼 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求统计各种月饼在各个城市的销量总和, 然后输出销量最高的月饼的最大销量和对应的种类编号。 如果销量并列第一, 按照编号递增顺序输出。 这意味着我们需要先统计出各种月饼的总销量,然后比较得出最大的销量, 然后从编号由小到大的顺序, 输出销量等于最大销量的种类编号。

「PAT乙级真题解析」Basic Level 1087 有多少不同的值 (问题分析+完整步骤+伪代码描述+提交通过代码)

- 题设要求给定一个正整数N,然后给定一个公式, 要求从1到正整数N分别代入到公式中得到的结果中, 可以得到哪些值的集合。 这题目的要求……也太简单明确了吧…… - 可以用数据模型集合来存储结果. C语言中没有集合, 可以使用数组存储结果, 索引对应结果, 索引位置的值对应出现的次数.

「PAT乙级真题解析」Basic Level 1079 延迟的回文数 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求将一个不是回文数的数转换为回文数,并且给出了具体的转换步骤,看到给出了具体的步骤,我们就知道这是一道模拟题。 具体步骤会将给定的数值各个数位上的数字逆序排列得到另一个数,然后两数相加得到新的数值。 重复上述过程直到得到回文数或者操作次数达到10次认为转换失败。

「PAT甲级真题解析」Advanced Level 1009 Product of Polynomials

题设要求计算两个多项式的积, 同题目1002一样, 多项式求积是有固定步骤的, 所以这是一道模拟题。 多项式求积的规则为: 将两个多项式中的项两两相乘, 相乘得到的结果项指数为两个项的和, 系数为两个项的乘积。 这意味着我们只需要用一个两重循环就可以覆盖所谓的"两两相乘", 将所有求得的结果项相加就是题设要求的多项式乘积。

CentOS 7 安装新版本的Node.js

本文主要介绍如何在CentOS 7中安装新版本nodejx, 而不是系统默认的node 6.x版本

「PAT甲级真题解析」Advanced Level 1008 Elevator

1. 题设要求模拟电梯的升降,并计算完成所有楼层停靠要求所需要的总时间。 2. 由于电梯停考规则和停靠时间题设已经明确给出, 所以这是一道只需要我们按照规则翻译成代码的模拟题。

「PAT甲级真题解析」Advanced Level 1006 Sign In and Sign Out

1. 题目给出一组学生进入机房的进入时间和离开时间, 要求找出最早进入机房开门的人以及最晚离开机房锁门的人. 到这里我们可以看出题目的重点在于查找, 而查找会涉及到数据的存储, 如果存储数据以及在储存的数据中进行查找是我们要考虑的核心。 2. 我们可以存储所有的进入时间和对应的学生ID, 然后比较出最早的进入时间。但我们在乙级的题目练习中多次提到, 数据存储是为了使用, 在这种情况下, 进入时间在进行一次比较之后就不会再用到了, 所以可以不需要存储全部进入时间, 而是直接存储当前最早进入时间然后不断更新。

「PAT甲级真题解析」Advanced Level 1005 Spell It Right

题设明确要求我们将给定的一个非负数的各个数字相加求和, 然后输出这个和各个数字的英文形式, 妥妥的模拟题, 而且步骤已经非常明确。 需要考虑的是给定的非负数最大可以是10^100(101位, 1个一后面跟了100个零), 所以需要用字符串来存储整数.

「PAT甲级真题解析」Advanced Level 1004 Counting Leaves

1. 题设要求按照从根结点开始自顶向下输出树结构每一层的叶子结点数目。 2. 这意味着我们需要设置计数器, 然后遍历树的每一个结点, 然后检查该结点是否是叶子结点, 如果是叶子结点, 则将计数器中该层次叶子结点个数+1. 3. 遍历树结构叶子结点可以用深度优先dfs搜索和广度优先搜索bfs.

「PAT甲级真题解析」Advanced Level 1002 A+B for Polynomials

题目要求计算两个多项式的和, 多项式求和是有固定步骤的, 所以这是一道根据定义/规则精准翻译为代码的模拟题。 多项和求和的规则为: 将两个多项式中指数相同的项的系数相加作为和多项式该指数项的系数, 这意味着, 如果我们用将所有项都罗列出来(没有的项表示为系数为0的形式), 则只要依次做N次加法就可以求得和多项式各个项的系数。

「PAT甲级真题解析」Advanced Level 1001 A+B Format

题设要求两个整数A和B的和, 并且按照指定格式输出。 由于给定整数的范围在整型范围内, 所以可以用整型直接存储和相加。 重点在于实现要求的用逗号将每三个数字进行分组。

Linux 内置工具 grep 使用手册

本文档介绍日常中使用grep的方法 "grep"是"Global RegularExpression Print"的首字母缩写, 使用过程中会涉及到正则表达式的使用 正则表达式的详细使用请查看正则表达式的文档

「PAT乙级真题解析」Basic Level 1076 Wifi密码 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求按照给定规则将给定的输入最终翻译成一串数字并输出,所以是一道模拟题。 由于题目设定的场景是题目的答案编号对应着wi-fi密码中的一位数字, 所以输入是(选项编号 - 是否是正确答案), 我们需要做的是读取选项编号, 和是否是正确答案的标志位, 如果是正确答案, 则输出对应的选项编号即可.

「PAT乙级真题解析」Basic Level 1073 多选题常见计分法 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求按照老师批改多选题的方法来计算学生的总分, 并且统计哪道题的选项选错的人最多。(选错的情况包括: 选了错误的和没选正确的两种) 多选题得分的规则为: 选择与答案一致得全部分数, 漏选得一半分数, 一旦选了正确选项之外的选项, 不得分。 本题的核心在于计算单道多选题学生得分的逻辑, 以及统计选项错误情况的逻辑; 由于要统计选项错误的情况, 所以不管能不能通过学生作答个数与正确选项个数之间关系直接得分情况, 都要挨个检查选项。

「PAT乙级真题解析」Basic Level 1072 开学寄语 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求查找学生携带的物品中是否有被禁止的物品。这涉及到"查找/搜索"。 由于物品编号是正整数, 所以我们可以用C的数组来存储禁止携带的物品编号, 数组索引作为编码, 索引位置值为1代表禁止携带。 搜索时只需要用学生携带的物品编号按索引查询数组对应位置的值是否为1, 就可以知道是否是禁止携带的物品。

「PAT乙级真题解析」Basic Level 1070 结绳 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求将一些一段一段的绳子串连起来, 但是每次串连的时候需要把两段绳子都对着折后套接在一起。要求能够串连出的最大长度。 这意味着进行一次串连,两端绳子的长度都会减半, 一段绳子参与串连的次数越多(串连成新的后再去与其他绳子串连,然后再去串连,如此重复)最终能提供的长度就约短。 这意味着越长的绳子最好放在越后面进行串连,这样串连的次数会更少,能贡献的长度就越长。 所以这道题就是将给定的各段绳子长度进行升序排列, 然后按排序后顺序进行串连计算最终长度。

「PAT乙级真题解析」Basic Level 1069 微博转发抽奖 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求从给定的一组字符串中的指定位置开始, 按照指定的间隔选择对应位置的字符串进行打印, 但是相同的字符串只能被打印一次(所以这里需要记录是否被打印过的标志位). 值得说明的是, 由于C语言中没有"字符串"类型, 所以用二维字符数组来作为一维字符串数组. 另外, 字符串是否被打印过的记录是一个典型的哈希表记录并用于查询的过程, 但是C语言中没有字典或集合等哈希表数据结构, 所以需要使用"字符串数组/二维字符数组"存储打印过的字符串, 通过对数组的遍历查询是否某个字符串已经在数组中来判断是否已经打印过该

「PAT乙级真题解析」Basic Level 1068 万绿丛中一点红 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一幅画(/矩阵/二维数组), 要求检查每一个点和周围的点的差值是否都超过给定阈值. 同时要求统计每一个点值出现的次数, 给出只出现过一次并且跟周围点的差值都超过阈值的点。 如果这样的点不存在, 则输出"Not Exist"; 如果这样的点有多个, 则输出"Not Unique"; 否则, 按格式"(列号, 行号): 点值"输出该点信息

「PAT乙级真题解析」Basic Level 1067 试密码 (问题分析+完整步骤+伪代码描述+提交通过代码)

如题目所示, 这道题的任务就是我们日常的输入密码, 检查密码是否等于正确密码的模拟题. 所以重点在于明确题目的要求, 然后准确地翻译成程序语言. 题目要求: - 最多只可以尝试指定次数 - 读到单个字符"#"时需要结束尝试 - 保证至少尝试一次 - 如果密码正确, 则输出"Welcome in"然后结束程序 - 如果密码错误, 则输出"Wrong password: 用户输入的错误密码" - 如果达到最大尝试次数还是没有输入正确密码, 则输出"Account locked"然后结束程序

「PAT乙级真题解析」Basic Level 1066 图像过滤 (问题分析+完整步骤+伪代码描述+提交通过代码)

十分常规的一个问题, 题目给定一个场景, 要求按照题设要求, 将满足条件的值进行指定处理, 所以这可以认为是模拟题, 只需要将题设要求翻译成代码即可. 题设给定一副图像(/矩阵/二维数组), 要求检查每一个点的值是否在给定的两个值之间, 如果是则替换成指定值. 最后输出处理后的图像(/矩阵/二维数组)

「PAT乙级真题解析」Basic Level 1065 单身狗 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定几组数对, 代表几对情侣, 随后给出一组数, 要求判断哪些数没有和它的情侣数一起出现在这组数中. 看到这里, 这道题明显是一道查找题/搜索题, 搜索题的主要核心是数据存储与比较。 于是这里只涉及5位整数, 所以存储用整型数组存储即可, 数组的索引和索引位置所存储数值代表一对情侣数。 而查找的过程, 只需要使用一个数组作为是否出席的标志位数组, 将给出的所有数作为索引值, 索引位置值置为1, 代表这些数出现过。 然后再次遍历给定的这组数, 对于每一个数, 先从第一个数组中拿到其对应的情侣数, 然后到标

「PAT乙级真题解析」Basic Level 1064 朋友数 (问题分析+完整步骤+伪代码描述+提交通过代码)

这道题依旧是一道"给出定义要求计算"的题目, 计算之后要求做的是统计. (1063谱半径是要求再最值) 所以依旧是按照定义翻译成程序语言, 然后进行常规统计. 再次强调,统计数据要关注统计的是哪些数据以及存储形式, 这里统计的是数值出现的次数, 所以只需要用数组存储即可. 由于题设给定"朋友数"是各个数位上数字的和, 涉及到各个数位数字的读取(可以用整数存储然后不断取余, 这题的数值也不会有溢出问题), 以下采用字符串形式存储数值用索引访问各位数字的方式进行计算。

「PAT乙级真题解析」Basic Level 1061 判断题 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求统计学生们判断题得分, 这是一道统计题。 一如既往, 对统计题, 我们先考虑要统计的数据以及存储形式。 由于是判断题, 题目给出的输入(题目分值, 答案以及学生的作答)都是数值形式, 所以存储为数组是合适且符合直觉的方式。 输入次序作为题目序号, 比较相同序号的题目答案和学生作答是否一致即可判断学生是否正确作答

「PAT乙级真题解析」Basic Level 1060 爱丁顿数 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求统计所有满足E天超过E英里的整数E, 然后给出E的最大值. 求一组数中的最大值是一个常规的过程, 所以本题的核心是如果统计所有E天超过E英里的E. 题设给出的数据形式是第i天跑了j英里, 我们需要统计的是跑超过j英里的天数. 所以我们需要先统计跑了j英里的天数, 然后从最大的距离开始, 将该距离加到小于这个距离的所有距离的天数统计中.

「PAT乙级真题解析」Basic Level 1056 组合数的和 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定N个非零数字, 要求计算可以组成的所有2位数之和。 由于数字非零, 所以每一个数字都可以选在个位或者十位。 如果一个数字选择放在十位, 则总和要加上它的十倍; 如果选择放在个位, 则总和要加上它本身。 所以, 总和等于每一个数字在十位所代表的值+其在个位所代表的值. 即所有数字之和 * 11

「PAT乙级真题解析」Basic Level 1055 集体照 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求将给定的N个人按要求排成K排, 由于有明确列出要求, 所以我们初步判断这是一道按照要求翻译成代码的模拟题。 由于身高和名称是绑定关系, 排序用的是身高, 输出用的是名称, 之前分析其他题目的时候说过, 这种时候要将绑定的信息存储为类键值对结构, 放在一起, C语言中这意味着结构体。

「PAT乙级真题解析」Basic Level 1054 求平均值 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定N个实数, 要求计算平均值. 平均值的计算我们非常熟悉, 所以不会是本题的核心. 题设设定, 输入数据可能非法, 计算平均值的时候不能将非法数包括在内. 所以本题的核心是识别非法输入实数和识别合法输入实数. 由于输入可能是非数字, 且涉及到对每一位的检查, 所以用字符串形式存储输入的实数, 计算和时再转为浮点数.

「PAT乙级真题解析」Basic Level 1052 卖个萌 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目给定三组符号集合作为"手", "眼", "口"的姿势, 要求根据用户输入的序号使用对应序号的"手", "眼", "口"以"[左手]([左眼][口][右眼])[右手]"的形式输出表情。 输出的部分很简单, 只要使用序号作为索引取到符号输出即可, 所以本题的重点不是输出, 而是如何从输入生成用于取数的符号集合. 对于一些封装层次比较高的语言, 完全可以使用正则之类的方法提取出符号生成集合. 也可以使用字符串分割的方式生成集合. 对于C语言, 需要自行实现符号提取逻辑.

「PAT乙级真题解析」Basic Level 1053 住房空置率 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求统计符合住房空置条件的房屋比例。这是一道统计题。 需要统计的数据是, 可能空置的房屋数量, 空置的房屋数量; 可能空置的条件: 比较每天的用电量是否小于给定用电量的天数, 如果天数超过一般, 则为可能空置. 空置的条件: 已经认定是可能空置的房间, 且比较用电量的天数大于给定天数。

「PAT乙级真题解析」Basic Level 1043 输出PATest (问题分析+完整步骤+伪代码描述+提交通过代码)

题目要求按照以"PATest"的顺序, 对给定字符串进行重新输出, 输出的"PATest"各个字母的数量需要与原字符串中的数目相同. 忽略其他字符。 通过题设的描述我们可以知道这是一道统计题, 需要统计的是"PATest"各个字符在原字符串中的数目 然后输出时只要检查统计值是否大于0, 如果大于0则输出并将统计值-1即可。 统计题如何进行数据统计和存储之前的题目已经多次提及, 这里不再赘述。

「PAT乙级真题解析」Basic Level 1039 到底买不买 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目给定两个字符串, 要求计算出两个信息: 1. 第二个字符串的字符的种类以及出现的次数是否是被第一串覆盖。 2. 覆盖时: 两串字符串的长度差值 没有覆盖时: 没有覆盖的字符的次数差值总和 所以这道题依旧是一道统计题。我们需要统计两个字符串中出现的字符种类的次数, 然后对统计数据进行比较, 并输出所求结果.

「PAT乙级真题解析」Basic Level 1037 在霍格沃茨找零钱 (问题分析+完整步骤+伪代码描述+提交通过代码)

这道题中涉及的这种转换类似于"时:分:秒"的转化。 按照这个思路, 我们可以构造一个从"Galleon.Sickle.Knut"转为完全转为Knut值的方法, 同时构造一个从完全以Knut计算的数值转化为"Galleon.Sickle.Knut". 则题目可以转换为: 将给定的两个格式为"Galleon.Sickle.Knut"的值转为完全Knut值, 计算二者的差值, 然后将差值转回"Galleon.Sickle.Knut"的格式

「PAT乙级真题解析」Basic Level 1035 插入与归并 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定两组数, 第二组数是第一组数用插入排序或归并排序进行排序的某个中间状态, 要求判断使用的是哪种排序, 并用这种排序算法对排序的中间状态再排序一次并输出. **从题设中我们识别到两个功能需求:** - 判断所使用的排序算法 - 使用对应排序算法再进行一次排序

「PAT乙级真题解析」Basic Level 1033 旧键盘打字 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目设定了一个场景: 有个键盘某些键坏了, 要你模拟这个键盘输入某段文本, 然后输出会被打印出来的内容。 **实质上, 这个题目是给定了一段文本, 然后给定了一个集合(键盘损坏的键集; 以及组合键规则, 如shift+t = T), 要求找出给定文本中不在集合中的内容, 并输出内容**。 **所以重点在于「查找当前字符是否在无法输出的字符集合中」的过程/逻辑.**

「PAT乙级真题解析」Basic Level 1032 挖掘机技术哪家强 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定了一组数据, 要求输出某个指定的最大值,这是一道求最值的问题。 最值问题的基本思路是:遍历 + 记录并更新最值。 在这道题中, 我们要遍历的信息是参赛者信息, 包括所代表的学校编号和参赛成绩。 要求的最值是总得分最高的学校编号和总分。(这说明我们要记录并更新的数据是学校编号和对应总分)

「PAT乙级真题解析」Basic Level 1030 完美数列 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一个正整数数列, 要求找出从中尽可能多的数组成一个数列,使得新数列满足指定条件。 即, 新数列的最大值 小于等于 新数列的最小值 乘以 给定系数p. 由于数列和系数p是给定的, 变量是选取不同子数列后所对应的最大值和最小值。 所以这是一个找满足指定条件的一对数作为最大值和最小值的问题。

「PAT乙级真题解析」Basic Level 1029 旧键盘 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目给定两行文字, 第一行是应该输入的文字, 第二行是实际被输入的文字, 我们需要对比两行的文字, 找出应该被输入但是没有被输入的文字, 即两行文字相差的文字. 由于没有被输入是因为键盘坏掉, 所以如果两个文字在实际文本中出现, 但是它们之间的文字没有在文本中出现, 则它们之间的文字就是缺失的。

「PAT乙级真题解析」Basic Level 1024 科学计数法 (问题分析+完整步骤+伪代码描述+提交通过代码)

由于科学计数法表示形式中含有字符, 所以输入数据需要存储成字符串。 由于题设提示长度不会超过9999字节, 所以数值位数大概在1万位。所以为了避免数值溢出, 结果也要存储为字符串(或者直接输出) 我们需要把科学计数法转成普通数字表示法的步骤明确好, 然后用编程语言翻译即可。

「PAT乙级真题解析」Basic Level 1012 数字分类 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目给出了明确的处理内容: 1. 对一些系列正数进行分类 2. 按照要求计算出5个数 3. 输出5个数字 而根据所要求的5个数的定义, 每个数都是从除以5之后得到的余数相同的数中进行计算. 所以分类时, 需要按照除以5之后所得余数来分. 【这里有个坑,A1的要求里,不是除以5之后余0就可以归到A1组,而是余0且是偶数才可以归到A1组】

「PAT乙级真题解析」Basic Level 1008 (问题分析+完整步骤+伪代码描述+提交通过代码)

PAT乙级BasicLevelPractice 1008题目给定了一个数组N和一个整数M, 要求: 1. 将数组每个元素向右移动M位 2. 不使用额外的数组这个要求很容易满足, 要求本身给出了操作内容, 第一直觉是模拟法搞定。由于这个要求的存在, 我们就需要重新考虑我们上面的方案. 考虑的目标是, 如果不使用额外的数组.(像极了一句废话) 换句话说, 我们要考虑"之前方案里的数组起到了什么作用", “是否有替代方式实现同样功能”我们在之前的练习题中提及过"数据的存储"是为了"使用存在的", 如果不需要使用,

「PAT乙级真题解析」Basic Level 1001 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目中给出了关于卡拉兹猜想的计算步骤,并要求给出按照给定的步骤执行到满足终止条件(此处为n等于1)所需要的次数。 我们知道,程序是只能执行一些重复的工作,所以程序的逻辑归根结底是条件、循环和递归的组合,最终达到按照指定步骤完成任务的目的。而此类题目直接给出了具体的步骤,与程序的本质不谋而合。程序是用来重复执行人为设定行为的,也可以说是对人行为的模拟。而解答此类题目就是直接将题设给出的步骤用编程语言语法翻译成代码逻辑,所以这种解法可以说是"模拟法"。

python遍历数组的同时改动数组元素

python的for-loop的特殊性在于其更接近于「遍历」而非循环 Q:存在一个数组,对其进行遍历,符合条件的保留/删除,不符合条件的删除/保留,该如何操作? 错误示例: lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6] for item in lst: if item == 0: lst.remove(item) pri...

[数据分析] 决策树算法:决策树的概念

1. 什么是决策树 顾名思义,决策树将以树状结构表现出来,被用来辅助作出决策。 具体结合例子来说,我们平时做决策时大多会伴随着层层的选择,比如找房子的时候,会考虑离工作/上课地点的距离、大小和价格、光照等等因素。 如果一个房子通勤快、价格低、光照好、空间大(虽然不太可能存在,但是只要存在这种房子)我们一定会作出“买/租”的决策。将我们作出这一决策的思考过程/选择过程以层次形式表现出来,如下: 虽然......

[Linux 实战] 日常篇 开始接触Linux强大的文本编辑器vim

强大的文本编辑器vi 在Linux如何打开文本文件,进行复制、粘贴、编辑、修改替换、撤销、重做、保存、另存? Vi 是多模式文本编辑器,提供四种模式:正常、插入、命令、可视模式 进入Vim:在终端输入vim [文件名] 或 vim ,前者编辑指定文本,后者新建文本(之后在vim进行保存操作) 1. 正常模式:即进入vim的起始模式 1.1 进入插入模式的操作: i:进入插入模式,光标位置...

[Linux 实战] 日常篇 查看文本、打包压缩和解压缩操作

1. 文本查看命令 1.1 cat命令:查看文本内容/文本内容显示到终端 cat会将完整的文本内容显示到终端上,相当于以终端为记事本打开了这个文件。cat的不足就是有时候文本内容较多,超出了终端能显示的范围,开头的显示内容会被覆盖。 1.2 head命令:查看文件开头 head用来查看文件内容开头部分,这个开头部分默认是10行,也可以通过增加选项head -(数字) 文本名来限制输出内容的范围。 ...

[Linux 实战] 日常篇 文件和文件夹的基本操作

文件和文件夹操作 1. 文件夹操作 1.1 mkdir命令:建立目录(创建文件夹) mkdir可以同时创建多个文件夹,中间以空格分隔 mkdir /a:表示在/目录下创建名为"a"的文件夹(需要有相应的操作权限) mkdir ./a:表示在当前目录下创建名为"a"的文件夹,可简写为 mkdir a mkdir /b c d:表示在/目录下创建名为"b"的文件夹,在当前目录下创建名为"c"和"d...

[Linux 实战] 日常篇 帮助命令、ls命令、cd命令

1. 帮助命令: man命令、help命令、info命令 命令行是Linux的基本操作方式。Linux系统的特色也正是在于强大的命令行模式,其提供了众多命令以及参数来实现各种操作。然而,命令多在使得操作更加灵活多样的同时,也提高了使用门槛、记忆的负担。 帮助命令就是为了减轻命令记忆上的负担而存在的。 命令有分为内部命令或外部命令,shell(命令解释器)自带的命令成为内部命令,其他的是外部命令 1...

[Linux实战] 安装Linux系统

虚拟机安装Linux系统(CentOS/Ubuntu/…) 以在VirtualBox上安装CentOS为例 1.1 安装VirtualBox: https://www.virtualbox.org/wiki/Downloads 1.2 下载CentOS的iso镜像: https://www.centos.org/download/ 1.3 新建并配置CentOS 打开VirtualBox,显示界面...

[算法基础] 二分查找

二分查找的原理 二分查找所应用的对象要求是有序的。 比如对一个按升序排好的数组,在其中查找给定值的元素。 查找时每次取正中位置mid = ( low + (high-low) / 2 ), 如果该元素即为所找元素,则查找结束; 如果该元素比所找元素大,则说明该元素右边的元素也必然比所找元素大,所以该元素右边的元素即数组右半部分可以舍去,此时令high = mid - 1。重置查找区间,进行下一趟查...

[Atom C/C++环境配置] 重点解决lnter-gcc不显示代码错误的问题

Windows下 Atom C/C++环境配置全程回顾 如果在操作过程中持续发生错误或网络卡顿,请使用科学的方式上网后重试。 下载Atom 官网链接:https://atom.io/ MinGW安装C/C++编译环境 官网下载页面链接:https://osdn.net/projects/mingw/releases/ 点击下图中左下角下载图标按钮进行下载 下载完成后打开安装包,一路continu...

[Web编程 01] IIS、Xampp安装

Client & Server 在web编程中所说的Client,是指用于获取web服务器内容的软件,最主要是指浏览器。而Server,是指用来提供web服务的软件。 服务器软件有许多,如IIS、Apache、Tomcat、Nginx。 IIS是 ...

[信息论与编码] 04. 熵的基本性质

熵的基本性质 1. 非负性:H(X) ≥ 0 熵描述的是某个集合统计意义上的不确定性,是自信息的加权平均。 而我们在一开始寻找描述不确定性的函数,引出自信息量概念的时候,便要求自信息的取值应在[0,+∞]。 故,熵作为自信息的加权平均,自然也是非负的。 2. 确定性:H(1,0)=H(1,0,0)=……=H(1,0,0,…,0)=0 ①根据熵的定义式,可知H(1,0)=1*log1=0 ②根据熵的...

[信息论与编码] 03. 离散信源、信源熵、联合熵、条件熵

离散信源 信源即信息发出的源头,在后续的信道模型中,信源发出的信息即视为信道输入的信息。 根据信源发出信息的取值,可将信源分为离散信源和连续信源。 顾名思义,离散信源即发出的信息取值为离散型的信源;连续信源即发出的信息取值为连续型的信源。 离散信源中又根据符号出现的概率是否与前面符号有关分为:离散无记忆信源和离散有记忆信源。 信息熵 前面已经了解过了自信息的概念。 自信息表示的是某个事件的不确定...

[信息论与编码] 02. 信息的测度

自信息 可寻得自信息定义式为: 、 当 r = 2 时,自信息单位为比特(bit) 当 r = e 时,自信息单位为奈特(nat) 当 r = 10时,自信息单位为哈特(hart) 自信息的意义 若 a 未发生,则 I(a) 表示a发生的不确定性; 若 a 已发生,则 I(a) 表示a提供的信息量。 自信息与概率 自信息描述的是事物的不确定度,而概率论是数学中描述不确定性的部分。自信息的数学描述...

[信息论与编码] 01. 信息的概念

@从现实世界到信息世界:信息 信息 日常生活中,我们很少刻意区分信息和消息。人五官所感所得,皆可被我们归为信息,且核心在于信息在自然世界与人之间传输,被我们主观意识所捕获的那个get的瞬间。 如果要加以区分。 信息不等同于情报; 信息不等同于知识; 信息不等同于消息; 信息不等同于信号; 信息、消息、信号 将客观物质运动和主观思维活动的状态以人所能感知的形式(如: 文字、图像、符号、数据、语言、音...

[运筹学]02. 通过图解法了解线性规划解的位置和求解原理

将自然语言描述的问题抽象成数学语言描述的问题(数学建模),如下: 将LP问题在平面上表现出来,即将线性规划的三要素在平面上表现出来。 建立平面直角坐标系,表示此处涉及的两个决策变量。 将约束条件(都为线性约束条件)在坐标系中画出: 将目标函数在坐标系平面中表现出来。 由于目标函数z = 2*x1 + 3 *x2表示的是三个变量的关系,要想在平面直角坐标系中表示,则需要画的是目标函数的等值线...

[运筹学]01. 线性规划问题初探

运筹学 01 — 线性规划问题 问题的识别 在投入到线性规划问题的各种计算之前,我想到的问题是,我如何在实际生活中识别出一个问题是线性规划问题,得以后续使用求解线性规划的方法对线性规划问题进行求解。 出术语本身出发,线性规划问题的识别点在于「线性」和「规划」两点上。 规划即我们所面对的问题是一个求最值或极值的问题,是在若干方案中选择一个方案进行实施。更具体一些,规划体现在如何从「我们拥有的资源」到...

TensorFlow环境配置_问题回顾

操作系统:windows10 家庭版 python3.6 (使用python3.7出错后,重装为3.6) 建立virtualenv虚拟环境时出错 命令行输入 virtualenv --system-site-packages -p python3 ./venv 提示 The path python3 (from --python=python3) does not exist 改变输入命令为 vi...

Mastodon