一、 前言
洛谷的刷题笔记,第一次写这道题的解法,第二次是为了学习map这个容器改写的一个解法,简单记录一下自己的思路,以及自己学习map容器的笔记。其实这两个方法的思路都一样,可能map容器的看起来更难,但是就当作是自己学习这个容器做的一道题吧。
题目:P1125 [NOIP2008 提高组] 笨小猴 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
二、解法一
可以完美通过测试点的解法。也不能说是解法一吧,反正就是第一次写的代码,简单说一下自己的思路。
简单来说就是把每一个字母当作数组的下标,相同字母(下标),就会让对应的值+1,就能够实现记录每一个字母出现的次数,其实map 方法也是一样的。最后的遍历,对字母的遍历这个我还是在另一道题的解答中学到的,因为自己平常做题的时候从来没有想过把字母对应的ASC码值去遍历,这个方法就很聪明哈哈哈哈哈。
这里需要注意的是,因为我们将每一个字母都进行了遍历,所以在对其出现个数找最小值时,一定要记住出现0次不是最小值。
然后判断质数的代码就很常见了这里就不多说。
//笨小猴
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int n)
{
if(n<2) return false;
for(int i=2;i<sqrt(n);i++)
{
if(n%i==0) return false;
}
return true;
}
int main()
{
string s;
int maxn=0,minn=100,count[150]={0},t;
cin>>s;
for(int i=0;i<s.length();i++)
{
count[s[i]]++;
}
for(int i='a';i<='z';i++)
{
if(count[i]>maxn) maxn=count[i];
if(count[i]<minn&&count[i]!=0) minn=count[i];
}
t=maxn-minn;
if(isPrime(t)) cout<<"Lucky Word"<<endl<<t;
else cout<<"No Answer"<<endl<<0;
return 0;
}
三、解法二_map容器学习笔记
其实思路一点都不难,跟解法一甚至感觉都一样,所以就不多说,主要就是学习map容器。
现在就是记录一下我自己的学习笔记。啥理论的我就不写了。因为现在也是浅浅的学习哈哈哈
1.map简单介绍
map主要用于键值对的映射关系,所以map中一定会有键(key)以及其一一对应的值(value)。
map很有意思,它会自动对所有数据依据键(key)进行排序,所有map内部的数据都是有序的。
同时map还有去重的功能,也是依据键(key)来的。说一句,map的所有方法都只对键(key)起作用,对值(value)不起作用。
2.使用map
头文件:#include <map>
同时要加上using namespace std;
例如:map<int,int> mp;
这样就算完成了一个map的定义,<>括号内的数据类型可以变化,float,double,char,string都可以
3.map的方法
这里说一句,关于map的迭代器,我的解法中体现了其中的一种。这样就可以遍历每一组键值对。
还有其他的就没深入学习了。
for (auto iter = mp.begin(); iter != mp.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;//此处用的是迭代器来查找的key和value;}
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数, 但是我觉得准确来说是指定元素(键)是否会出现,出现就返回1,不出现返回0,因为一开始我对这个函数理解错了,用它去统计次数,但是发现返回的要么是1要么是0,所以我觉得理解为是否会出现的话会更加贴切一点
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
主要就是理解这些方法吧,但是我觉得不一定会用得上,其实我觉得学习map更多的是去理解这种键值对的映射思想,因为对于我之前的解法一来说,我只是将键存入当作数组的下标,其实这也是一种思想,总之就是感觉会拓宽自己的思路吧。
#include<iostream>
#include<cstring>
#include<map>
#include<cmath>
using namespace std;
bool IsPrime(int n) {
if (n < 2) return false;
for (int i = 2; i < sqrt(n); i++) {
if (n % 2 == 0) return false;
}
return true;
}
int main() {
map<char, int> mp;
int max = 0, min = 9999, ans;
string str;
cin >> str;
//cout << str.length() << endl;
for (int i = 0; i < str.length(); i++) {
mp[str[i]]++;
}
//调用 begin()/end() 组合,遍历 map 容器
for (auto iter = mp.begin(); iter != mp.end(); ++iter) {
//cout << iter->first << " " << iter->second << endl;//此处用的是迭代器来查找的key和value;
if (iter->second > max) max = iter->second;
if(iter->second <min) min= iter->second;
}
//cout << max << " " << min << endl;
ans = max-min;
if(IsPrime(ans)){
cout<<"Lucky Word"<<endl;
cout<<ans;}
else {
cout << "No Answer" << endl << "0";}
return 0;
}