牛客网刷题总结
string
//有些题明显可以投机取巧的
//有些题要找规律
//输入一整行string
string s;
while(getline(cin, s))
istream& getline (istream& is, string& str, char delim);
//分开输入
while(cin >> s1 >> s2)
//10.0.3.193可以输入为
while(cin>>a>>ch>>b>>ch>>c>>ch>>d)
//单个char转换成string
string str(1,c);
//string 中寻找和截取
size_t found = str.find_first_of(';', start_idx=0);
found = str.find(substr);
found = str.rfind(substr);
found == string::npos; //string::npos=size_t的最大值;
string s1 = str.substr(start_idx)
string s2 = str.substr(satrt_idx, n);
//取后n位
string s3 = str.substr(str.size()-n, n);
//字符串插入
string str = "meihao";
string sstr = str.insert(0,2,'a');
cout<<sstr<<endl; //aameihao
string sstr = str.insert(1,"hello~");
cout<<sstr<<endl; //mhello~eihao
string str = "meihao";
string sstr = str.insert(1,"hello~",3);
cout<<sstr<<endl; //mheleihao
//字符串去重
str.erase(unique(str.begin(), str.end());
//删除指定字符
char c = '*';
str.erase(remove(str.begin(), str.end(), c);
//大小写之间差32
‘A'+32='a'
//idx与字符之间转换
char c;
int idx1 = c - '0';
int idx2 = c - 'a';
//数字的比较有的时候可以转换成字符串
int i = std::stoi(str);
string str = std::to_string(i):
//字符输入
char c = getchar();
while(cin >> c);
//字母转大小写及判断
#include <ctype.h>
if(isupper(c))
if(isdigit(c))
if(isalpha(c))
char c1 = toupper('a');
char c2 = tolower('A');
//string大小写转换
transform(strA.begin(), strA.end(), strA.begin(), ::toupper);
transform(strB.begin(), strB.end(), strB.begin(), ::tolower);
//char s[]所表示字符串以‘\0'结束
//统计字符用map<char, int>
容器
//std::ceil floor头文件
#incloude <cmath>
//无重复排序set map
//有重复排序priority_map
//四舍五入 std::round
//int (in+0.5);
//容器迭代循环中末尾设置
it!=m.end();
//vector拼接
vec3.insert(vec3.end(),vec1.begin(),vec1.end());
//list,map,set迭代器it只支持++/--
//如需偏移多位要用std::advance(it,num);
算法
//最大元素,最小元素
auto it = max_element(vec.begin(), vec.end());
auto it = min_element(vec.begin(), vec.end());
//排序要用,不改变相同元素顺序
stable_sort();
//对部分元素进行排序,并复制到另一个容器里。(待排序的容器首指针,尾指针,接收元素的容器的首指针,尾指针)
partial_sort_copy (InputIterator first,InputIterator last, RandomAccessIterator result_first,RandomAccessIterator result_last, Compare comp);
//翻转algorithm
std::reverse(a.begin(), a.end());
//寻找
std::find(a.begin(), a.end(), val)
//多层vector初始化
vector<vector<int>> vt(N, vector<int>(M, 0));
//全排列
sort(a.begin(), a.end());
do {} while(next_permutation(a, a+a.size()));
//多线程
#include<thread>
#include<mutex>
#include<condition_variable>
thrread t1(func, arg)
t1.join();
mutex mtx;
unique_lock<mutex> locker(mtx);
conditon_variable A;
A.wait(locker);
A.notify_one();
//设置精度
cout <<setiosflags(ios::fixed); //只有在这项设置后,setprecision才是设置小数的位数。
cout << setprecision(0) << f << endl; //输出0位小数,3
//1不是素数
//最大递增子序列
//密码转换先考虑写成helper形式
//数组题找矩阵下标与输出间关系
//回溯法,注意在进入迭代函数更新全局量,在离开时恢复全局变量,添加结束判断,适当剪枝
//闰年计算 if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
//注意break;continue;的检查
数组
链表
链表第k节点,翻转链表,复杂链表复制,两链表的第一个公共节点, 孩子们的游戏(圆圈中最后剩下的数--约瑟夫问题),链表环入口,删除链表重复节点,链表排序
二叉树
重建二叉树,合并有序数组,序列化二叉树,树的子结构,二叉树的镜像,从上往下打印二叉树,二叉搜索树的后续遍历,二叉树中和为某值路径,二叉树和双向链表,二叉树的深度,平衡二叉树,二叉树下一节点,对称二叉树
二分法
动态规划:
寻找状态转移方程,构建table存储或使用递归实现
- 一维:
- 斐波那契数列:爬楼梯,数兔子
- 最长递增子数列,最大子序和,乘积最大子序列,称砝码, 数字游戏
- 跳石板(2017网易)
- 合唱队(2017网易,注意两个dp[][]考虑负数情况)
- 黑暗字符串
- 孩子们的游戏(圆圈中最后剩下的数--约瑟夫问题)
- 二维:
计算字符串的距离,字符串最长公共子串,字符串最长公共子序列,放苹果,背包问题,多重背包问题,完全背包问题,鸡蛋掉落
组合总和
栈
DFS:
全部设为全局变量flag,table,results等,
递归函数中设置结束判定,并保存相应结果
改变变量,分不同情况递归,if(flag)return;,恢复战场
(也可以把变量作为递归函数形参实现自动回复战场)
ig: 数独, 迷宫问题, 24点游戏, 全排列
特殊
四则运算带括号,大数,加减乘除
尺取法,求包含ABCDE的最短字串(彩色宝石项链)
混合颜料(2017网易)不要二
数字游戏 (2017网易)
统计找规律比较费时麻烦
BFS
利用queue,push初值,while(!empty()),根据front()与约束条件push新值
- 地牢逃脱、water
- 幸运的袋子(BFS DFS)
构建特殊数据结构
今日头条--异或--构建字典
归并排序
分治法
剑指offer 二刷没有迅速AC
树的子结构
二叉搜索树的后续遍历
丑数
数组中的逆序对
数字在排序数组中出现的次数
和为S的连续正数序列
全排列字符串排列
正则表达式匹配
序列化二叉树