1.字符串
当不给Case的数量的时候
一般会用0 或者回车为结尾分隔
我推荐用 cin.getline()
cin.get()与cin.getline()的区别在于后者遇到回车后结束但会读入回车
两者都能遇到空格继续读取空格后的字符
while (cin.getline(str,20))
{
if (str[0] == '\0')
break;
}
字符串的删除 s.erase(begin,length)
字符串的截取s.substr(begin,end)
### 2、把整数插入字符串的尾部
#include<bits/stdc++.h>
using namespace std;
#include <string>
int main()
{
string str;
int a = 1;
int b = 2;
str.push_back(a + '0');
str.push_back(b + '0');
cout << str << endl;
reverse(str.begin(), str.end()); //翻转字符串
cout << str << endl;
return 0;
}
//运行结果
###3
从下标1开始输入字符数组
const int N = 2e5+7;
char str[N];
scanf("%s", str + 1);
统计不同字符串出现的次数
对map进行遍历
#include <map>
map<string, int>v;
map<string, int>::iterator it;
for (it = v.begin(); it != v.end(); it++)
{
cout << it->first << ":" << it->second << endl;
}
#include <map>
map<string,int>v
相当于把每一个字符都加上了数字的特性
例题一
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
(统计字符串中某前缀出现的次数)
input
banana band bee absolute acm
ba b band abc
output
2
3
1
0
#include<cstdio>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
using namespace std;
map<string, int>v;
int main()
{
char str[20];
while (cin.getline(str, 20))
{
if (str[0] == '\0')
break;
int l = strlen(str);
string s;
for (int i = 0; i < l; i++)
{
s += str[i];//把每个单词的从第一个字符开始累加
v[s]++; //把目前累加的结果用map记录出现的次数
}
}
string s;
while (cin >> s)
cout << v[s] << endl;
}
2.汉字所占字符数为二,统计个数的时候要除以2
两个数最小公倍数=两个数乘积/两个数最大公约数
可以用库函数next_permutation进行全排列
#include <iostream>
using namespace std;
#include <algorithm>
int main()
{
int a[5] = { 1,2,3,4,5 };
do
{
for (int i = 0; i < 5; i++)
cout << a[i]; cout << endl;
} while (next_permutation(a, a + 5));
return 0;
}
增强for
int arr[5] = { 1,2,3,4,5 };
for (int item : arr)
{
cout << item << endl;
}
//用有序对
保存数下标 以及排序后数的下标
#include <bits/stdc++.h>
using namespace std;
using pll = pair<int, int>;
int main()
{
vector<pll>v(10);
int cnt = 0;
//有序对输入数据
for (auto&[x, y] : v) {
cin >> x;
y = ++cnt;
}
//有序对输出数据
for (auto [x, y] : v) {
cout <<x<<" "<< y << endl;
}
return 0;
}
sort(v.begin(), v.end(), greater<pll>()); //pair 降序排序
O(sqrt(n))复杂度素数筛
bool isprime(int n)
{
if (n == 1)return 0;
for (int i = 2; i*i < n; i++)
{
if (n % i == 0)return 0;
}
return 1;
}
结构体排序
struct tree
{
int h;
int v;
}T[10007];
bool this_sort(tree n1, tree n2)
{
if (n1.v == n2.v)
return n1.h > n2.h;
else
return n1.v < n2.v;
}
等价于
struct tree
{
int h;
int v;
bool operator < (const tree& ano) const
{
if (v == ano.v)
return h > ano.h;
else
return v < ano.v;
}
}T[10007];
//有序对
//头文件
typedef pair<int, int> PII;
1、可以建立有序对的 vector
vector<PII>v
2、可以建立有序对的 map
map<int, vector<PII>> mp;
有序对的vector push_back()要一次同时first和second
char str = 'R';
mp[5].push_back({ 5, str == 'R' ? 1 : 0 });
cout << mp[5][0].first << " " << mp[5][0].second << endl;
3、有序对的数组
const int N = 2e5 + 7;
PII p[N];
4、有序对的自定义排序
typedef pair<int, int>pill;
map<int, vector<pill>>mp;
for(auto :i mp)
{
sort(i.y.begin(), i.y.end(), [](PII a, PII b) {
return a.x < b.x;
}
}
5、vector的自定义排序
vector<int>v;
sort(v.begin(),v.end(),[](int a,int b)
{
return a>b;
});
6、用map存左端下标可以用count()检查左端是否存在
map<int.int>mp;
for(int i=0;i<n;i++)
{
mp[i]++;
}
if(mp.count(3))
cout<<"Yes<<endl;