Leetcode 刷题经验总结 C++版

一 容器

每个容器都提供了很多方法,这里只介绍最适用于这种数据结构的一些方法,并且在做题时候会常用的一些方法。

1.vector

vector 容器和数组是一样的,基本上除非题目输入定义了vector类型,自己也不太会引入vector。毕竟要多打很多字。

//定义:
vector <int> v;
//访问:
v[i];
//更新
v[i]=a;
//大小
v.size();
//末尾插入
v.push_back(a);
//末尾删除
v.pop_back();
//清空
v.clear();
//判断空
v.empty();
//排序
sort(v.begin(),v.end());//从小到大
sort(v.rbegin(),v.rend());//从大到小
//自定义排序
bool compare(int a,int b) 
{ 
    return a< b; //升序排列,如果改为return a>b,则为降序 
} 
sort(v.begin(),v.end(),compare);
//翻转
reverse(v.begin(),v.end());

2.stack

stack是栈,用数组加一个指示下标的变量也可以模拟stack,引入容器可以节省指示变量的处理,以及预防一些越界的问题。Stack 主要任务就是进栈出栈

//定义
stack<int> s;
//入栈
s.push(i);
//出栈
s.pop();
//栈顶元素
s.top();
//判空
s.empty();
//大小
s.size();

3.queue, deque

双端队列包含了队列的功能,所以一般直接用Deque,以防写着写着需要有变化。

//定义
deque<int> d;
//增加头元素
d.push_front(i);
//增加尾元素
d.push_back(i);
//访问头元素
d.front();
//访问尾元素
d.back();
//删除头
d.pop_front();
//删除尾
d.pop_back();
//判空
d.empty();
//长度
d.size();

4. set,multiset

set主要作用是自动去重,对于期望得到不重复的结果,使用set维护输出列表。由于set,multiset通过平衡二叉树实现,有自动排序功能。set不允许重复,multiset允许重复

//定义
set<int> s;
//添加元素
s.insert(i);
//删除元素
s.erase(i);
//查找元素 返回指针
s.find(i);
//大小
s.size();
//遍历
for(set<int>::iterator it=s.begin(); it!=s.end();it++)
{
    cout<<*it<<endl;
}
//范围查找
m.lower_bound(elem);
m.upper_bound(elem);

5. map,multimap,hashmap

map是一个使用键值对key-value 模式的容器,map不允许重复键值,而multimap允许重复键值。适用于词频统计类的问题。map的底层是红黑树。
hashmap操作与map相同,但是底层是hash表,可以在O(1)时间内完成访问操作。

//定义
map<char*, int> m;
//插入
m.insert(pair<char *, int>(key,value))
m[key]=value;
//删除 
m.erase(key);
//访问
m[key];//如果没有这个key,则返回0
//遍历
for(map<char *,int>::iterator it=m.begin();it!=m.end();it++)
{
    cout<<it->first<<" "<<it->second<<endl;
}
//大小
m.size();
//清空
m.clear();

二 常用类

1. string

//构造
string s="123";
char *a="123";
string s = a;
//拼接
a+b
//子串
a.substr(1,2);
//查找
a.find("12");//返回字串第一个字符的下标,如果没有找到,返回string::npos
//替换
a.replace(1,2,"ab"); //ab3
//删除子串
a.erase(1,2); //3
//长度
a.size();
//访问
a[i];
//转成char *
a.c_str();

三 常用函数

1. sort()

int a[5]={3,1,3,5,2};
sort(a,a+5);
//自定义cmp
bool cmp(int a,int b){
	return a>=b;	//可以理解为当a>b时,把a放在前面
}
sort(a,a+5,cmp);

2. next_permutation()

int a[5]={1,3,2};
do
    {
        for (int i=0;i<3;i++)
            cout<<a[i];
        cout<<endl;
    }while (next_permutation(a,a+3));
//output:
132
213
231
312
321

3. strtok()

char sentence[]="This is a sentence with 7 tokens"; 
char *tokenPtr=strtok(sentence," "); 
   
 while(tokenPtr!=NULL) {   
  cout<<tokenPtr<<'\n';   
  tokenPtr=strtok(NULL," ");   
 } 

4. atoi(), atol(), atof()

字符串转换成数字

atoi("123");
atol("123456789");
atof("123.888");

5. sprintf()

数字转换成字符串

sprintf(s,"%d", 123);

6. strtol()

进制转换

char * stop;
cout<<strtol("1234", &stop, 7)<<endl;

7. distance()

返回迭代器之间的距离

distance(list1.begin(),list1.end());

8. merge() & inplace_merge()

merge() 算法会合并两个序列并将结果保存到第三个序列中,它使用 < 运算符来比较元素。图 1 表明合并操作被运用到 these 和 those 容器的内容上,结果序列保存在 both 容器中。
inplace_merge() 算法可以合并同一个序列中两个连续有序的元素序列。它有三个参数: first、second、last 和 last 是一个双向迭代器。这个序列中的第一个输入序列是 [first,second), 第二个输入序列是 [second,last),因而 second 指向的元素在第二个输入序列中。结果为 [first, last)。
merge

int a[5]={1,3,5,7,9};
int b[5]={2,4,6,8,10};
int c[10]={0};
merge(a,a+5,b,b+5,c);
for (int i=0;i<10;i++)
    cout<<c[i]<<" ";

inplace_merge

int a[10]={1,3,5,7,9,2,4,6,8,10};
inplace_merge(a,a+5, a+10);
for (int i=0;i<10;i++)
    cout<<a[i]<<" ";

9.max_element(), min_element()

返回一个指向最大(小)的元素的指针

int a[10]={1,3,5,7,9,2,4,6,8,10};
int * ans1=max_element(a,a+10);
int * ans=min_element(a,a+10);
cout<<*ans1<<endl;
cout<<*ans<<endl;

四 常用自定义函数

1. 判断是否是质数

考虑效率,最快的方式是去网上拉素数表,一般1000以内就可以

#include <math.h>
int prime_list[] ={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
bool is_prime(int n)
{
    for (int i=0;i<168;i++)
    {
        if (n%prime_list[i]==0)
            return false;
        if (prime_list[i]>int(sqrt(n))
            break;
    }
    return true;
}

2. 判断是否互质,求最大公因数

辗转相除法, 最大公因数是1就是互质。

#include <algorithm>
int gcd(int a, int b)
{
    if (a<b) swap(a,b);
    while(a!=0)
    {
        a = a % b;
        if (a!=0)
            swap(a,b);
    }
   return b;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章