算法笔记
良夜_
这个作者很懒,什么都没留下…
展开
-
[编程题]Tree Traversals (25)
关键词:数据结构,二叉树试题链接:Tree Traversals 问题描述:思路:用广度优先搜索的方法解决八数码问题。可以构建一颗“状态树”,把九宫格每一种状态视为一个结点,初始状态视为根节点。那么我们计算从初始状态到目标状态的最少步数其实就是相当于求从根节点到目标结点的最少步数,这样就把理解问题尽可以用广度优先算法解决了。对于广度优先搜索问题首先让根节点入队,对于每个结点有四个搜索方向:然而这四个方向不一定都走得通,还需要考虑到:1.搜索不能超过九宫格边界。2.不能走“回头路”。对于满足以原创 2021-05-09 21:18:14 · 92 阅读 · 0 评论 -
[编程题]八数码
关键词:递归,穷举,排序,广度优先搜索BFS试题链接:八数码问题描述:思路:用递归(深度优先搜索)的方法解决全排列问题。类比《算法笔记》里深度优先搜索那一节里面提到的“走迷宫”问题,把输入字符串的每一个字符都看做是一个结点,当做是迷宫的一个岔路口,每到一个岔路口都看一看自己当前有几种选择(用flag数组进行标记),在选择一个字符添加到结果字符串中以后要记得回退。当结果字符串的长度等于输入字符串的长度时,设置递归出口,打印字符串。备注:观察输出,在深度优先搜索之前需要对输入的字符串进行排序。原创 2021-05-06 19:09:18 · 121 阅读 · 0 评论 -
[编程题]全排列
关键词:递归,穷举,排序,深度优先搜索DFS试题链接:全排列问题描述:思路:用递归(深度优先搜索)的方法解决全排列问题。类比《算法笔记》里深度优先搜索那一节里面提到的“走迷宫”问题,把输入字符串的每一个字符都看做是一个结点,当做是迷宫的一个岔路口,每到一个岔路口都看一看自己当前有几种选择(用flag数组进行标记),在选择一个字符添加到结果字符串中以后要记得回退。当结果字符串的长度等于输入字符串的长度时,设置递归出口,打印字符串。备注:观察输出,在深度优先搜索之前需要对输入的字符串进行排序。原创 2021-05-06 10:51:09 · 132 阅读 · 0 评论 -
[编程题]Linked List Sorting
关键词:链表,查找试题链接:Linked List Sorting问题描述:思路:由于题目提到的地址范围很小,所以可以考虑用静态链表来解决问题。依照题目的要求,需要在node结构体中新添一个flag的变量用于记录当前结点是否在结点链中(是否为有效结点),读取输入完毕以后,用sort函数进行排序,先按照有效结点排前面的规则排序,再按照结点中数据从小到大的顺序进行排序。备注:这道题需要注意的是在它给出的一大串输入里面,可能有的结点根本就不再链表里面,这个时候按照地址需要遍历一遍静态链表,把在链原创 2021-05-04 16:53:52 · 114 阅读 · 0 评论 -
[编程题]Sharing
关键词:链表,查找试题链接:Sharing问题描述:思路:由于题目提到的地址范围很小,所以可以考虑用静态链表来解决问题。依照题目的要求,需要在node结构体中新添一个cnt的变量用于记录当前结点是否第一次出现在结点链中。解决方案:#include<iostream>#include<string>using namespace std;const int maxn=100010;//牺牲地址换取时间?struct NODE{ int next;原创 2021-05-04 15:23:02 · 74 阅读 · 0 评论 -
[编程题]简单计算器
中缀表达式转换为后缀表达式。原创 2021-05-03 19:39:02 · 293 阅读 · 0 评论 -
[编程题]任务调度
关键词:最小堆,拓扑排序,字符串试题链接:任务调度问题描述:思路:前序任务比较多的任务的优先度应该设定为较低值,可以把一个任务的前序任务数。这道题的大体思路是:先声明一个数据结构node,记录任务名称,任务的前序任务数。在优先队列里将前序任务数的任务优先级设定为较低值。对于输入的每一行,首先将当前行任务存入map中(如果是第一次出现),再将括号其后序任务存入map中(如果是第一次出现),并修改其前序任务数。备注:priority_queue 容器适配器定义了一个元素有序排列的队列。默认原创 2021-04-29 18:53:12 · 463 阅读 · 0 评论 -
[编程题]1071. Speech Patterns (25)
关键词:map,字符串试题链接:Speech Patterns (25)问题描述:思路:这道题的大体思路是先把字符串转换为全小写,然后遍历字符串,寻找字符串中的”word“(也就是被非字母数字分割出的string)用map存储它们出现的次数最后输出。备注:1.map本身是有序的,而unordered_map是无序的。map底层为红黑树,unordered_map底层为哈希表。2.在寻找“word”的过程中,首先需要判断当前遍历到的字符是否为字母或数字,如果是,加入到当前模式s中,如果不是且原创 2021-04-29 09:42:33 · 71 阅读 · 0 评论 -
[编程题]Are They Equal (25)
关键词:字符串试题链接:Are They Equal (25)问题描述:思路:这道题可以用string来解决的。比较麻烦的地方是它的输入可能有多种形式…可能就会被忽略。比如: 7 0.987 00009873 0000 0.000它的输入不像正常的int和float一样,它会有前置0,以至于输入要用string来存储。下面就是我遇到的比较容易出错输入:有效数字不够,处理时就需要在后面补0。 if (s.length() > i) { r原创 2021-04-28 11:49:39 · 56 阅读 · 0 评论 -
[编程题]Set Similarity (25)
关键词:set , vector, STL试题链接:Set Similarity (25)问题描述:思路:这道题很显然是要用集合set来解决的。C++STL模板中的set(集合)有两个特点:1.集合中没有重复元素。2.集合内部是自动有序的。对于集合求交并补常用的几个函数://求v[a] v[b]并集并将结果存放于一个vector u中set_union(v[a - 1].begin(), v[a - 1].end(), v[b - 1].begin(), v[b - 1].end()原创 2021-04-27 23:21:44 · 69 阅读 · 0 评论 -
[编程题]Student List for Course (25)
关键词:vector , map试题链接:https://www.nowcoder.com/questionTerminal/e9482512572944199d1babbcdf567b3d问题描述:思路:这道题的核心就是变长数组vector的应用(以及map的应用),做题之前应当好好考虑一下vector该用在存储什么变量是最合适的,考虑它“长度可变”的特性让自己结题的过程变得更加简单。在Course List for Student(https://blog.csdn.net/qq_4564原创 2021-04-26 17:04:28 · 95 阅读 · 0 评论 -
[编程题]Course List for Student (25)
关键词:vector , map试题链接:https://www.nowcoder.com/questionTerminal/a6e370ac55fc4bd49d0bb62710e35868问题描述:思路:这道题的核心就是变长数组vector的应用(以及map的应用),做题之前应当好好考虑一下vector该用在存储什么变量是最合适的,考虑它“长度可变”的特性让自己结题的过程变得更加简单。备注:使用algorithm中的sort函数对vector中的数据进行排序时,应当用到begin()和en原创 2021-04-26 15:47:09 · 116 阅读 · 0 评论 -
[编程题]最大公约数和最小公倍数
关键词:最大公约数,辗转相除法试题链接:https://www.nowcoder.com/questionTerminal/cf4091ca75ca47958182dae85369c82c问题描述:思路:求解最大公约数常常会用到辗转相除法(欧几里得算法),基于定理:若a,b均为正整数,则gcd(a,b)=gcd(b,a%b)。具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。可以采用递归的方法求解最大原创 2021-04-26 12:05:32 · 299 阅读 · 0 评论 -
[编程题]1019. 数字黑洞 (20)
关键词:递推关系,动态规划试题链接:https://www.nowcoder.com/questionTerminal/2e6a898974064e72ba09d05a60349c9e问题描述:根据算法笔记上的思路:对于每一个A,其左侧所有P的数目与其右侧所有T的数目相乘得到的结果即为这个A能够组成的pat数,统计所有A能够组成的pat数求和,即为题目的答案。备注:最好每次相加的时候都能够取一次模,不然可能有溢出的风险。解决方案:#include<iostream>#i原创 2021-04-26 11:48:11 · 78 阅读 · 0 评论 -
[编程题]有几个PAT(25)
关键词:递推关系,动态规划试题链接:https://www.nowcoder.com/questionTerminal/5e7d025e91ab468f909cb93d431b89c3问题描述:根据算法笔记上的思路:对于每一个A,其左侧所有P的数目与其右侧所有T的数目相乘得到的结果即为这个A能够组成的pat数,统计所有A能够组成的pat数求和,即为题目的答案。备注:最好每次相加的时候都能够取一次模,不然可能有溢出的风险。解决方案:#include<iostream>#inc原创 2021-04-25 22:25:40 · 89 阅读 · 0 评论 -
[编程题]整数无序数组求第K大数
关键词:TopK问题,堆,随机选择试题链接:https://www.nowcoder.com/questionTerminal/097ab63cffa847d89716f2ca8c23524f问题描述:这道题我使用堆把它搞定了,之后会继续整理随机选择算法的解决方案。解决方案:#include<iostream>#include<vector>#include<queue>using namespace std;int main(){ v原创 2021-04-22 22:09:09 · 212 阅读 · 0 评论 -
[编程题]找x
看到这道题的第一反应是用二分查找解决了(因为是算法笔记二分法那一章节里面的题目)。后来一拍脑袋想起来二分法不是得让序列有序么。这才用自己的方法解决了这道题目。实际解决问题的时候还是要更多地理解题目本身。#include <stdio.h>#include <iostream>using namespace std;int main(){ int n; int a[200]; cin >> n; for(int i =0;i&.原创 2021-04-22 19:51:50 · 121 阅读 · 0 评论 -
编程题:看电视
试题链接:http://codeup.cn/problem.php?cid=100000584&pid=0关键词:区间贪心ac代码如下所示:(比较奇怪的是我在声明区间数组时,将itv声明为int itv[num]然后运行就会报错,但是声明int itv[100]就能ac,当时困扰了我很久,明明一点逻辑问题都没有了但是不停的“答案错误”…决定以后直接就像int itv[100]这样声明数组。)#include<iostream>#include<algorithm>原创 2021-03-31 12:10:40 · 145 阅读 · 0 评论 -
PAT B1020 月饼
试题链接:https://www.nowcoder.com/questionTerminal/6fc9a928c7654b0fbc37d16b8bd29ff9关键词:简单贪心策略,数组,排序ac代码如下所示:#include<iostream>#include<algorithm>#include<iomanip>using namespace std;struct mooncake{ float store; //库存量 float原创 2021-03-31 10:37:46 · 62 阅读 · 0 评论 -
编程题:八皇后问题
这道题目描述跟它实际的有点区别,它的输入应该只有一个,且是一个整数,输出才是92个序列中与这个整数对应的那个序列。看了《算法笔记》以后感觉这个问题的逻辑已经基本掌握了,做这道题时遇到的最大的问题是:1.审题:关于数组记录的数据应该是从0开始还是从1开始,这个一开始的时候我没有仔细看题就是从0做起的,后来发现要从0做起。2.数值传递:唉,只能说该用全局变量的时候就用吧,传来传去我自己就糊涂了,本来递归就很烂了…下面是ac的代码:#include<iostream>#include&l.原创 2021-03-30 22:45:41 · 154 阅读 · 0 评论 -
编程题:吃糖果
关键词:递归,动态规划写递归之前一定要考虑的递归中的两个重要概念:递归边界和递归式。我的解决方案:#include<stdio.h>#include<iostream>using namespace std;int dp(int N){ //递归出口 if(N==1)return 1; //1块巧克力只有一种方案 else if (N==2)return 2; //2块巧克力有两种方案 else return dp(N-1)+dp(N-原创 2021-03-29 17:22:50 · 277 阅读 · 0 评论 -
编程题:谁是你的潜在朋友
标签:数组,哈希,排序试题链接:https://www.nowcoder.com/questionTerminal/0177394fb25b42b48657bc2b1c6f9fcc我的解决方案:#include<stdio.h>#include<iostream>using namespace std;const int maxn=10000;int main(){ int readers[maxn]={0}; int readerHasTabl原创 2021-03-29 17:07:17 · 122 阅读 · 0 评论 -
codeup 排序 问题 C: EXCEL排序
试题链接:http://codeup.cn/problem.php?cid=100000581&pid=2样例输入:4 1000001 Zhao 75000004 Qian 88000003 Li 64000002 Sun 904 2000005 Zhao 95000011 Zhao 75000007 Qian 68000006 Sun 854 3000002 Qian 88000015 Li 95000012 Zhao 70000009 Sun 950 3样例原创 2021-03-29 16:34:13 · 130 阅读 · 0 评论 -
算法基础-排序题
C++排序算法交换式排序-快速排序选择式排序-堆排序归并排序交换式排序-快速排序快速排序是一种不稳定排序方法,在元素移动过程中产生了逆序。排序算法的稳定性即,排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。快速排序用到了递归函数,其时间复杂度为o(nlogn)。其代码如下:class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 *..原创 2021-03-28 15:58:45 · 82 阅读 · 0 评论 -
PAT A1025【PAT Ranking】
我的解法:#include <string>#include <cstring>#include <algorithm>#include <iostream>using namespace std; struct student{ char id[14]; int scoreRange; int testRoomId; int testRoomRange; float score;};bool cmp.原创 2021-03-28 11:11:44 · 48 阅读 · 0 评论 -
PAT B1009 【说反话】
#include <string>#include <iostream>using namespace std;int main(){ string in,out; cin>>out; while(cin>>in){ out=in+" "+out; } cout<<out<<endl; return 0;}原创 2021-03-27 22:21:50 · 47 阅读 · 0 评论