这次笔试就只是做了两道签到题模拟栈,然后最短距离暴力骗了5个点,做的很暴躁,总结一下中间遇到的问题吧,每天进步一点。
数据结构基础之一一队列
队列有五种基本操作,插入队尾、取出队首、删除队首、队列大小、清空队列。
现在让你模拟一个队列的操作,具体格式参考输入。
输入描述:
第一行输入一个整数T,表示接下来有T组测试数据。
对于每组测试数据:
第一行输入一个整数Q,表示有Q次操作。
接下来Q行,每行输入一种队列操作方式,具体格式如下:
初始状态下队列为空。
插入队尾: PUSH X
取出队首: TOP//仅仅是看一下队首元素,不要把队首元素删除
删除队首: POP
队列大小: SIZE
清空队列: CLEAR
1 保证操作为以上5种的任意一种。
输出描述:
对于每组测试数据:
如果操作为“取出队首”,输出队首元素,如果无法取出,输出“-1”
如果操作为“删除队首”,如果无法删除,输出“-1”
如果操作为“队列大小”,输出队列大小
其他操作无需输出
示例输入
2
7
PUSH 1
PUSH 2
TOP
POP
TOP
POP
POP
5
PUSH 1
PUSH 2
SIZE
POP
SIZE
输出描述:
1
2
-1
2
1
签到题的一个,但是这道题也卡了好久,主要是在输入输出上。开始比较烦躁,题目没有看清楚,说是模拟队列操作,第一想法就变成了用两个栈去模拟队列的操作,题目样例能过,写了半天AC0,后面发现是CLEAR操作的问题,'L’打成小写的了,debug了好久。然后字符串转化成数字的函数也忘记了,后面开根号的函数也是,真的就醉了,就只能当场写了,体验很差。这里也mark一下吧。
//头文件是
//ASCIIToIntelger c风格的字符串转化,传入是char *,因此如果是string类型的话需要调用 string.c_str()
aoti(const char *s);
//StringToIntelger 传入一个string对象,会做范围检查,超出会RunTimeError
stoi(const string *s);
第二个问题是输入和输出,在PUSH操作时会要读两次
while(cin>>str){}//这样读出来停止不了输入流
getline(cin,str);//这样会读取直到回车,但是要注意上一次输入的回车,前面最好加个getchar()
cin.ignore(20,'\n');//也可以达到相同的效果,第一个参数是忽略次数的计数,超过终止,后面一个参数是要忽略的字符
再一个最后的问题是CLEAR操作,当时不是很清楚直接将que中的元素直接pop出来是否会将size置为0,主要是把size和capacity搞混了,size是指容器中的元素个数,pop出来当然会使得元素个数置为0,capacity是指的容器的容量,是在创建容器时,分配,这里还需要
还是要多对着源码学习
deque的resize()函数用法
deque的reserve()函数用法
小Q在平面上给定了2 *n个点,这些点n个属于A集合,n个属于B集合,现在让你在A集合和B集合中各选择一个点,求所有可能中两个点的最短距离为多少?
这里的距离指的是欧氏距离,对于点(x1, y1), (x2, y2)他们的欧式距离为: ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{\left(x_{1}-x_{2}\right)^{2}+\left(y_{1}-y_{2}\right)^{2}} (x1−x2)2+(y1−y2)2
输入描述:
第一行输入一个整数n,代表A集合和B集合内的点的数量为n。
接下来n行,每一行2个数x和y,代表A集合内的点的坐标
接下来n行,每一行2个数x和y,代表B集合内的点的坐标
1
输出描述:
对于每组数据,输出一个答案代表最短距离,结果保留3位小数。
输入数据示例:
2
4
0 0
0 1
1 0
1 1
2 2
2 3
3 2
3 3
4
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
输出数据示例:
1.414
0.000
这道题没啥优化思路,暴力法两两计算吧,主要是没时间想了,然后就是sqrt()函数名忘记了。
别人写的答案
然后输出要求保留3位小数,用的是c风格的printf,mark一下C++风格的cout吧
cout.setf(ios::fixed) //用定点格式显示浮点数;
cout.setf(ios::showpoint) //显示浮点数小数点后的道0;
cout.precision(2) //设置精确专度为2位并返回上一次属的设置。
有n张卡牌,第i张牌正面为 a i a_i ai反面为 b i b_i bi ,n张牌排成一行,一开始全部正面朝上,现在可以执行若干次操作,每次操作可以选择相邻的两张牌,先交换它们的顺序,再翻转它们,求最少的操作次数,能使得牌上的数字从左到右非降。
输入描述:
第一行输入一个正整数表示n(n≤18),第二行n个整数表示序列a,第三行n个整数表示序列b。
输出描述:
输出一个数字表示答案,无解输出-1
这道题没啥思路,先mark。
用两个栈实现队列,支持队列的基本操作。
输入描述:
第一行输入一个整数N,表示对队列进行的操作总数。下面N行每行输入一个字符串S,表示操作的种类。
如果s为"add",则后面还有一个整数x表示向队列尾部加入整数X。
如果S为"poll",则表示弹出队列头部操作。
如果s为"peek",则表示询问当前队列中头部元素是多少。
1 < N< 1000000, -1000000 < X < 1000000
数据保证没有不合法的操作。
输出描述:
对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。
这道题也是签到题,原来上C++课上做过了,所以第一题上来思路就是这个,后面居然出现了,不然浪费好多时间,思路就是一个栈维护入队元素,当要出队时,将第一个栈中的元素依次pop到第二个栈中,再将第二个栈的栈顶元素出栈。
以后题目还是要一定先认真读,这个习惯一直没改掉
给你一棵无限深度的满二叉树,节点的编号按层次依次编号,即第-层节点编号为1,第二层节点编号为2,3,
第三层节点编号为4,5, 6…以此类推。
接下来有Q次询问,每-一次询问让你找一 个编号为x的结点在深度为k的祖先节点的编号是多少?
输入描述:
输入第一行一个整数Q,代表有Q次询问
接下来Q行,每一行输入两个数x和k。
1 1 0 4 10^4 104
1
1
对于每一组测试数据,如果深度为K的祖先存在,输出结点编号,不存在输出-1
输入示例:
4
10 1
10 2
10 3
10 4
输出示例:
1
2
5
-1
这道题也没看清题,题目说了是无限深度 满二叉树,节点k的父亲为k/2,左子为2k,右子2k+1。