牛客网刷题总结

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存储或使用递归实现

递增栈 柱状图中最大矩形最大矩形
栈的压入、弹出序列

DFS:

全部设为全局变量flag,table,results等,
递归函数中设置结束判定,并保存相应结果
改变变量,分不同情况递归,if(flag)return;,恢复战场
(也可以把变量作为递归函数形参实现自动回复战场)
ig: 数独, 迷宫问题, 24点游戏, 全排列

特殊

四则运算带括号,大数,加减乘除
尺取法,求包含ABCDE的最短字串(彩色宝石项链)
混合颜料(2017网易)不要二
数字游戏 (2017网易)

统计找规律比较费时麻烦

BFS

利用queue,push初值,while(!empty()),根据front()与约束条件push新值
- 地牢逃脱、water

  • 幸运的袋子(BFS DFS)

构建特殊数据结构

今日头条--异或--构建字典

归并排序

链表排序
315. 计算右侧小于当前元素的个数

分治法

395. 至少有K个重复字符的最长子串

剑指offer 二刷没有迅速AC

树的子结构
二叉搜索树的后续遍历
丑数
数组中的逆序对
数字在排序数组中出现的次数
和为S的连续正数序列
全排列字符串排列
正则表达式匹配
序列化二叉树

LeetCode没有迅速AC

posted @ 2019-06-06 23:00  narjaja  阅读(1260)  评论(0编辑  收藏  举报