LeeCode刷题总结(一)
LeeCode刷题总结(一)
前言
用leecode题目练手,练习编码的感觉。先从简单题开始,刷完后和知识点结合总结。
先刷简单题,对遇到的问题类型和不知道的知识点先列举。有空闲时间继续归类。
一、c++的常用容器和用法
1、string
//初始化
string(const char * s);//用s初始化当前字符串
string(int n,int c); //用n个字符c初始化字符串
string a("hello");
string a = "hello";
a.begin();//得到指向字符串开头的Iterator
a.end();
a.rbegin();
a.rend();
a.size();
a.length();
a.empty();
a.clear();
a.swap(string s);//交换当前字符串和s的值
a.(0,const char *s);//从0位置插入字符串s
a.append(const char*s);//当前字符串后添加字符串s
a.substr(int pos,int n);//从a的pos位置截取n个字符
a.copy(b,int n,int pos//返回值为实际拷贝的字符数目;把当前串pos位置开始的n个字符拷贝到s为起始位置的数组中;
//第38题,在string后面添加一个char
//string后面追加的方法有三种
a.append(const char*s);//当前字符串后添加字符串s,参数也是string注意入参类型
a.push_back(char c);//入参为char类型
a = a+'0';//和第二中类似
2、vector
常用操作
//初始化的五种方式
vector<int> a(10);//定义了10个整型元素,初始值不确定
vector<int> a(10,1);//10个初始值为1的整型元素
vector<int> b(a);//整体赋值
vector<int> b(a.begin(),a.begin()+3);//局部整体赋值
int b[3]={1,2,4};
vector<int> a(b,b+3);//从数组总整体赋值
//增查删改
a.assign(b.begin().b.begin=3);//assign函数整体赋值
a.assign(4,2);//4个2
a.back();//返回最后一个元素
a.front();//返回第一个元素
a.clear();//清空向量a
a.empty();//a向量为空返回true
a.pop_back();//删除最后一个元素
a.erase(a.begin()+1,a.begin()+3);//删除包含begin()+1的元素到不包含begin()+3的元素
a.push_back(5);//末尾插入5
a.insert(a.begin()+1,5);//第一个元素后插入5
a.insert(a.begin()+1,3,5);//第一个元素后插入3个5
a.size();//a的个数
a.capacity();//a能容纳的个数
a.resize(10);//调整a的容量多删少补
a.resize(10,2);
a.reserve(100);
a.swap(b);//a/b向量的内容整体交换
a == b;//比较操作
遍例
//下标
//vector<int> A;
for(auto i=0;i<A.size();i++)
{
A[i] = A[i]*2;//改变向量中每个元素乘以2
}
//迭代器
vector<int>::iterator iter;
vector<int>::reverse_iterator riter;//反向迭代器
for(iter=A.begin();iter!=A.end();iter++)
{
cout<<*it<<" ";//迭代器类似指针的方式访问数据
}
for(iter=A.rbegin();iter!=A.rend();iter++)
{}
常用算法
#include<algorithm>
sort(a.begin(),a.end());//包含a.begin()不包含a.end()的排序,a.end()是结束指针所以就是整个向量的排序
reverse(a.begin(),a.end());//包含a.begin()不包含a.end()的倒置
copy(a.begin(),a.end(),b.begin()+1);//用a的元素覆盖b.begin()+1(包含)的元素
find(a.begin(),a.end(),10);//如果a中存在10返回其位置;
二、链表
三、栈
//第23题,有效的括号
stack<char> st;
st.top();//判断栈定元素
st.pop();//出栈
st.push(ch);//入栈
四、哈希表
cpp中的数据类型unordered_map,实际上就是实现了哈希表。在查询时哈希表的效率特别高,查询多的操作优先考虑这种数据类型。
//第23题,有效的括号
unordered_map<char,char> pairs={
{')','('},
{']','['},
{'}','{'}
};
stack<char> st;
for(char ch:s)
{
if(pairs.count(ch)){
if(st.empty()||st.top()!=pairs[ch])
{
return false;
}
st.pop();
}
else{
st.push(ch);
}
}
常见用法
[查找元素是否存在]都是查找键值Key是否存在
若有unordered_map<int, int> mp;查找x是否在map中
方法1: 若存在 mp.find(x)!=mp.end()
方法2: 若存在 mp.count(x)!=0 //unordered_map中不允许重复的Key值所以存在返回1不存在返回0。
pairs.count(ch);//是3种反括号中的一种,有反括号就要判断是出栈还是返回false
st.top()!=pairs[ch];//用key值寻找value(正括号),和上面组成一对的用法而不用枚举;
[插入数据]
map.insert(Map::value_type(1,"Raoul"));
[遍历map]
unordered_map<key,T>::iterator it;
(it).first; //the key value
(it).second //the mapped value
for(unordered_map<key,T>::iterator iter=mp.begin();iter!=mp.end();iter++)
cout<<"key value is"<
也可以这样
for(auto& v : mp)
print v.first and v.second
五、双指针
第26、27题
//我们就必须用 O(1) 的额外空间来处理它。如何解决?我们可以保留两个指针 i 和 j,其中 i 是慢指针,j 是快指针。

浙公网安备 33010602011771号