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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章