- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PTA天梯赛L1刷题总结(三)15分题型(超详细题解)
多么感⼈!时隔⼀年多,我终于来更新15分题型的博⽂了。突然发现L1的题⽬量扩充了!⼀共有哦20道题。哎~都写⼀遍题解好
了。在这⾥推荐下胡凡的算法笔记!在基础算法和数据结构上给了我很多细致的讲解启发。过去刷题真想有个类型题解便于我总结学习,现
在积累了⼀些可以⾃⼰动⼿写啦!⼀个学习⼩建议:刷题不要怕困难,要坚持下去,及时总结!
⾸先对20道题进⾏⼀个分类吧~
⽬录
⼀、哈希映射问题
L1-003 个位数统计
此题中N是⼀个不超过 1000 位的正整数,遇到这样的问题⼀般采⽤字符串遍历的⽅式解决。(超出了整型的范围)。题⽬要求对 N 中每
⼀种不同的个位数字,以 D:M 的格式在⼀⾏中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
回顾⼀下int类型和long long类型有多少位
int类型 -2^31~2^31 -1 【int类型在C语⾔中占4个字节,即32个⼆进制位,最⾼位为符号位】
long long类型 −2^63,2^63 −1 【long long类型在C语⾔中占8个字节,即64个⼆进制位】
int只能表⽰到10^9,⽽long long 可以表⽰到10^18。根据不同的情况需定义不同的数据类型。
思路:
根据题⽬的要求,第⼀想到的是⽤哈希表来存储每位数字对应的次数,这个是⼀⼀映射的关系。每⼀位上就是0到9⼗个数字,⽤⼀个长度
为10的整型数组就⾏。对于出现次数为0的,就不⽤输出了。这⾥加个判断就可以。
对于字符串问题,⾸先先读⼊每⼀个字符,遇到⼀个字符,则对应出现次数+1。最后输出时如果映射的值不为0,则按照格式输出即可。
本题有两个注意点
1) memset(s,0,sizeof(s)); 是关键,对数组初始化都设置为0,否则会出错。⽤到这个时需要加上头⽂件 #include string.h
2) 注意遍历时str[i]是⼀个字符,要str[i]-0来转化为int类型
#include iostream
#include string
#include string.h
using namespace std;
int main()
{
string str;
int s[10];
int i;
cinstr;
memset(s,0,sizeof(s)); // 关键,对数组初始化都设置为0,否则会出错
for(i=0;istr.length();i++)
{
s[str[i]-0]++; // 注意str[i 是⼀个字符,要str[i]-0 来转化为int类型
}
for(i=0;i10;i++)
{
if(s[i]!=0)
couti:s[i]endl;
}
return 0;
}
下⾯给出第⼆种⽅法,博主去刷⼒扣时的常⽤⽅法。我们可以利⽤map来解决这个哈希数组问题。
这种⽅法有⼏个学习点
1)定义map的时候记得加上头⽂件#include map
如mapstring,int就是代表从string类型到int类型的映射,且map默认是按key值从⼩到⼤排序。
2)访问map容器内元素⽅法,⼀个是通过访问下标,⽐如下⽅的mp[c-’0’],还有⼀种就是通过迭代器(如mapint,
int::iterator it)。通过it-first访问键,it-second访问值。
下边的写法可以这么写
for(mapint,int::iterator it = mp.begin();it!=mp.end();it++)
{
cout it-first : it-second endl;
}
3)for(char c:str)这是for循环的⼀个简便写法,遍历字符串str的每⼀个字符就是c,也就是⽅法⼀中的str[i],⽐⽅法⼀的遍历要⽅
便很多对吧。
#include iostream
#include string
#include string.h
#include map
using namesp
文档评论(0)