小小知识点

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白开水为啥没味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值