华为机试
- HJ2 计算字符个数
- count_if函数用法详解
- lambda表达式
- 常函数
- HJ3明明的随机数
- 方法一:使用数组
- 方法二:使用容器set
- 方法三:使用容器vector+算法
- HJ4 字符串分隔
- 方法1:string的substr函数
- 方法2:
- 方法3:
- HJ8 合并表记录
- 方法一
- 方法二
- 思考:两种map的用法哪个更好
- HJ9 提取不重复的数字
- 方法一:使用vector
- 方法二:使用unordered_set
- 此处为什么使用unordered_set而不是使用set?
- 知识点
- math.h与algorithm
- 万能头文件
HJ2 计算字符个数
题解看到一个比较新颖的解法:
#include <algorithm>
#include <iostream>
#include <string>using namespace std;int main()
{string s;getline(cin, s);char c = tolower(getchar());cout << count_if(s.begin(), s.end(), [c](char i) { return towlower(i) == c; }) << endl;
}
敲黑板:
-
- 没有用过count_if()算法
-
- 第三个参数没有看懂,是lambda表达式?
count_if函数用法详解
lambda表达式
常函数
HJ3明明的随机数
方法一:使用数组
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{int n;while(cin>>n){int a;int count[501]={0};for(int i=0;i<n;i++){cin>>a;count[a]=1;}for(int i=0;i<501;i++){if(count[i]==1)cout<<i<<endl;}}return 0;
}
方法二:使用容器set
set容器可以自动实现去重和排序
#include <iostream>
#include <set>
using std::cin;
using std::cout;
using std::endl;
using std::set;
int main()
{int n;while(cin>>n){int a;set<int> mset;for(int i=0;i<n;i++){cin>>a;mset.insert(a);}set<int>::iterator it;for(it = mset.begin();it!=mset.end();it++){cout<<*it<<endl;}}return 0;
}
方法三:使用容器vector+算法
unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序。
C++ Unique函数 详细
#include <iostream>
#include <vector>
#include <algorithm>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{int n;while(cin>>n){int a;vector<int> mvec;for(int i=0;i<n;i++){cin>>a;mvec.push_back(a);}sort(mvec.begin(),mvec.end());auto tmp=unique(mvec.begin(),mvec.end());mvec.erase(tmp,mvec.end());vector<int>::iterator it;for(it = mvec.begin();it!=mvec.end();it++){cout<<*it<<endl;}}return 0;
}
HJ4 字符串分隔
2022.01.16
方法1:string的substr函数
代码:
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
void Parse(string str)
{int len = str.size();if(len>8){string ms=str.substr(0,8);cout<<ms<<endl;Parse(str.substr(8,len-8));}else {int k = 8-len;for(int i=0;i<k;i++){str += '0';}cout<<str<<endl;}
}
int main() {string str;while(cin>>str){Parse(str);}
}
// 64 位输出请用 printf("%lld")
方法2:
#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
int main()
{string str;while(getline(cin,str)){int len=str.size();if(len%8!=0){int k=8-len%8;str.append(k,'0');}// for(int i=0;i<k;i++)// {// str+='0';//}len = str.size();for(int i=0;i<len;i+=8){cout<<str.substr(i,8)<<endl;}}return 0;
}
方法3:
cout的成员函数width()设置输出的宽度
cout的成员函数fill设置输出宽度不够时,填充字符’0’
流操作符left指定左对齐
#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::left;
int main()
{string str;while(getline(cin,str)){int len = str.size();for(int i=0;i<len;i+=8){cout.width(8);cout.fill('0');cout<<left<<str.substr(i,8)<<endl;}}return 0;
}
HJ8 合并表记录
方法一
#include <iostream>
#include <map>
using namespace std;int main() {int n;while (cin >> n) { // 注意 while 处理多个 caseint key,value;map<int,int> mmap;for(int i=0;i<n;i++){cin>>key>>value;mmap[key]+=value;}for(auto it=mmap.begin();it!=mmap.end();it++){cout<<it->first<<" "<<it->second<<endl;}}
}
方法二
#include <iostream>
#include <map>
using namespace std;int main() {int n;while (cin >> n) { // 注意 while 处理多个 caseint key,value;map<int,int> mmap;map<int,int>::iterator tmp;for(int i=0;i<n;i++){cin>>key>>value;tmp = mmap.find(key);if(tmp!=mmap.end()){mmap[key]=tmp->second+value;}else{mmap[key]=value;}}for(auto it=mmap.begin();it!=mmap.end();it++){cout<<it->first<<" "<<it->second<<endl;}}
}
思考:两种map的用法哪个更好
map用法深入思考。
HJ9 提取不重复的数字
方法一:使用vector
#include <iostream>
#include <vector>
using namespace std;int main() {int num;while (cin >> num) { // 注意 while 处理多个 caseint a;int stat[10]={0};vector<int> mv;while(num>0){a=num%10;stat[a]++;if(stat[a]==1){mv.push_back(a);}num = num/10;}for(auto it=mv.begin();it!=mv.end();it++)cout<<*it;cout<<endl;}
}
// 64 位输出请用 printf("%lld")
方法二:使用unordered_set
#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;int main() {int num;while (cin >> num) { // 注意 while 处理多个 casestring str=to_string(num);reverse(str.begin(),str.end());unordered_set<char> mset;string res;for(char c:str){if(mset.count(c)!=1){res+=c;mset.insert(c);}}cout<<stoi(res)<<endl;}
}
此处为什么使用unordered_set而不是使用set?
HJ3明明的随机数
其中的方法使用的是set,这两个场景有什么不同?
知识点
math.h与algorithm
math.h 是常用的数学库。例如 开平方,取绝对值,计算三角函数。
Algorithms 是Template库,处理某范围元素的函数,例如 for_each (对每个做…), count (统计出现的个数),partition (分两部分)。
万能头文件
#include <bits/stdc++.h>