pintia_L1_20题目集合
旨在理清思路和整理遗忘的点
这次的刷题大部分是二刷,只是把思路总结,还有遗忘的常用的函数用法归纳出来
题目
N个数求和
这道题主要应用结构体进行分数的化简,以及gcd。第二次作题我把整数部分在每次每次相加的时候都单独算出来在结构体当中存储,看了之前的代码猜想起来把整数部分放到最后区计算显然是比较明智的。之前我还在相加之前把每个和数进行了化简,也比较可取。唯一我感觉不太完善的部分是最后整除的时候如果分母是负数,对结果的影响,在第二次作的时候我先计算的绝对值,再分别取相反数。
A-B
主要考察了stl中string类中find函数的使用。以及未找到时候的判断与string:npos进行判断
参考博客
贼清楚,我还自己测试了下是否正确。我以前一直用== -1来判断是否查找到,一直都用错了。但其实主要是由于-1在计算机内以补码形式存储,它和无符号长整型的最大值有着一样的二进制数。现在我认为把-1赋值给string::npos,纯粹为了简单。(static const size_t npos = -1)
#include <iostream>
#include <string>
using namespace std;
int main(){
string s = "Alice Bob Charlie";
size_t position;
position = s.find("none");
//static const size_t npos = -1;
printf("%lu", position);
if(position >= 0){
cout << " Found" << endl;
}
else{
cout << "Not" << endl;
}
printf("%lu", size_t(-1));
return 0;
}
帅到没朋友
主要利用set来进行标记,然后利用algorithm中的count判断是否已经输出过。最后需要注意的是最后数据的输出格式"%05d"。
输出GPLT
主要是思维的变换,记得我第一次做的时候是想把每个字符个数统计出来,以其中最小的个数输出GPLT,然后再输出别的,真的是很傻。我完全可以把GPLT的个数分别单拿出来,输出一次就自减,当减到0就停止输出这个数。
出租
这到题主要利用set进行去重,同时因为set底层实现逻辑,对于整数从小到大,所以只需要另开一个数组来存储出现的数字。接下来就是对电话号码进行分析,找出其下标。由于仅仅只有11个数,随便瞎搞就行。这里不妨复习下二分。
int findd(int *a, int b, int n){
bool flag = false;
int l = 0, r = n -1;
int mid;
while(l <= r){
mid = (l + r) / 2;
if(a[mid] > b){
l = mid + 1;
}
else if(a[mid] < b){
r = mid - 1;
}
else{
flag = true;
break;
}
}
return flag ? mid : -1;
}
经过测试,好像写不写二分对这道题的时间没有啥影响,都是4ms,(数据很小)只有当利用algorithm中的find的时候变成了3ms。(也是偶然,因为find并没有优化只是逐个对比,所以当自己懒的写纯粹的比较查找时可以考虑find
find
需要包含头文件
InputIterator find (InputIterator first, InputIterator last, const T& val);//函数原型
LeftPad
这道题纯粹使用string类进行求解加以判断就行。需要注意的是当用getline()函数读入一行字符串时,需要把前面scanf处理剩余的'\n'用getchar()处理掉,后边字符串处理经常遇到。
古风排版
这道题对我来说让我想起了声明数组时给数组赋初值char ch[122] = {' '}
这种仅仅是把ch[0] = ' '
,我以前误以为时把所有的都赋值成一样的了。老老实实写循环赋值。
敲笨钟
这道题让我直到了只要把字符串读进来,想怎么玩就怎么玩。只需要依据题设进行处理输出。
猜数字
这道题更是有意思了,自己没有考虑全,却因为测试用例没有而通过了,也提醒了自己以后真正应该关注的时算法的正确性,而不是简简单单的ac.
错误主要是对lower_bound,upper_bound的用法记忆错误。
他们都是在左闭右开的区间内寻找符合的值,lower_bound是返回第一个大于等于目标值的迭代器,upper_bound是返回第一个大于目标值的迭代器。也就是说如果没有目标值的话,我们可以利用返回值进行插入而使得数据依旧有序。在部分题中贼有用。
阅览室
这道题我的思路是利用map来存储每本书的借书时间,然后在还书的时候更新借书数量和总的阅读世界。一个需要注意的是,在还书之后要把对应的书从map中删除,因为一天中可能会有多个人借同一本书。
本来我想的是用visit数组来表示,-1表示未借,1表示已借,0表示归还,最后遍历一遍visit数组得到结果,因为有上述情况显然不成。
整除光棍
第一眼看到这道题真是无从下手,但看到示例后肯定不能单纯的试。在看了题解之后才拓宽了我的思路,他只是要结果,还有被除数都是1***,完全可以模仿除法的运算,因为每次补齐的位置都是1,这样就可以得出结果,第一次需要把寻找合适的1的个数使能够被除数除到。
天梯赛座位分配
这道题我第一次在摸底测试中并没有做出来,现在看原来的代码也有点看不懂。在这次做这道题中,我使用了队列数组来存储每个队伍队员的编号,每次顺次将编号入到相应的队列中,需要注意的是当只有一个队伍没有分配够时跳出循环,自己在以隔2的入队。最后注意输出格式的控制就没问题。这道题还是有点启发的,其实从题目的描述中就可以感觉到用队列应该会比较好做,但是第一次作的时候太着急(老师把这道题放到了第一道题的位置qwq)
前世档案
这道题刚开始有点蒙,但仔细一想,他其实就是叶子节点的编号,对于每次y,n就相当于一次选择,选择是走左边,还是走右边,走左边他的起始编号还是从1开始,而走右边他的起始编号就变成了当前他所在树所拥有的最大的叶子节点/2 + 1,这样迭代下去,最后他一定会进入叶子节点,而此时我们的index下标也已经计算完毕。
刮刮彩票
这道题唯一需要的就是把未知的数给填补出来,这需要读入的时候记录下已经有了的数字,之后再遍历一边确定。随后就是简单的输入输出,自己定义全局数组来存储已知数来输出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律