面試常見的手撕代碼--鏈表苫耸、排序州邢、二分、二叉樹

由于找工作要惡補(bǔ)數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)褪子,為了手撕代碼方便量淌,寫了很多代碼并測(cè)試。都是些找工作诚油剩考的呀枢,現(xiàn)在貼上來(lái),不定期更新部分代碼笼痛。

  • 含有鏈表反轉(zhuǎn)裙秋,排序算法,查找算法和二叉樹的遍歷算法。
  • 都是巢蟹裕考的手撕代碼财忽,建議找工作的童鞋使勁背。
  • 里面每一段代碼都是經(jīng)過(guò)調(diào)試的泣侮。
  • IDE建議使用CLion即彪,個(gè)人感覺(jué)比較好用,沒(méi)有VS那么大活尊,不想破解就下社區(qū)版隶校,配置教程可以參考我另一篇文章Window10極簡(jiǎn)CLion配置教程

鏈表反轉(zhuǎn)

1. 結(jié)點(diǎn)定義

struct node{
    int node_data;
    struct node* next;
    node(int x) : node_data(x){}
};

2. 遞歸版

node* In_reverseList(node* head){
    if(head!=NULL && head->next != NULL){
        // l是新鏈表頭
        node* l = In_reverseList(head->next);
        head->next->next = head;
        head->next=NULL;
        return l;
    } else
        return head;
}

3. 非遞歸版

node* reverseList(node* head){
    if (head != NULL && head->next != NULL){
        node* p = head;
        node *q, *newNode=NULL;
        while (p!=NULL) {
            q = p->next;
            p->next=newNode;
            newNode=p;
            p=q;
        }
        return newNode;
    }
}

排序算法

1.冒泡排序法

// 冒泡排序
vector<int> bubblesort(vector<int> u_in)
{
    vector<int> unii = u_in;
    for (int i = 0; i < unii.size(); i++)
    {
        int tmp = 0;
        for (int j = i + 1; j < unii.size(); j++)
        {
            if (unii[i] > unii[j])
            {
                tmp = unii[i];
                unii[i] = unii[j];
                unii[j] = tmp;
            }
        }
    }
    return unii;
}

2.選擇排序法

// 選擇排序法
void selectsort(int *a, int n) {
    int min;
    for (int i = 0; i < n; i++) {
        min = i;
        for (int j = i + 1; j < n; j++) {
            if (a[min] > a[j]) {
                min = j;
            }
        }
        if (min != i) {
            int temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }
    }
}

3.快速排序法

// 快排蛹锰,數(shù)組版
void quicksort(int *a, int left, int right)
{
    if (left >= right) return;
    int i = left;
    int j = right;
    int based = a[left];
    while (i < j) {
        while (i < j && a[j] >= based) j--;
        if (i < j) {
            a[i] = a[j];
            i++;
        }
        while (i < j && a[i] < based) i++;
        if (i < j) {
            a[j] = a[i];
            j--;
        }
        if (i >= j) break;
    }
    a[i] = based;
    quicksort(a, left, j - 1);
    quicksort(a, j + 1, right);
}

4.歸并排序法

// 歸并排序單元使用
void mergearr(int* a, int begin, int mid, int end, int *temp){
    int i=begin, j=mid+1;
    int m = mid, n = end;
    int k = 0;
    while (i <= m && j<= n){
        if (a[i]<a[j])
            temp[k++]=a[i++];
        else
            temp[k++]=a[j++];
    }
    while (i<=m)
        temp[k++]=a[i++];
    while (j<=n)
        temp[k++]=a[j++];
    for (i=0;i<k;i++){
        a[begin+i]=temp[i];
    }
}

// 歸并排序算子
void _merge_sort(int* a, int begin, int end, int *temp){
    if(begin<end) {
        int mid = (begin + end) / 2;
        _merge_sort(a, begin, mid, temp);
        _merge_sort(a, mid + 1, end, temp);
        mergearr(a, begin, mid, end,temp);
    }
}

// 歸并排序
int* MergeSort(int *a, int len){
    int *temp = new int[len];
    _merge_sort(a,0,len-1,temp);
    return temp;
}

查找算法

1.二分查找(遞歸版)

// 二分查找
int getkey (int* a, int key, int low, int high)
{
    int mid = (low+high)/2;
    if (low>high) return -1;
    if (a[mid]==key) return mid;
    else if (a[mid]<key)
        return getkey(a,key,mid+1,high);
    else
        return getkey(a,key,low,mid-1);
}
int main(){
    int a[8]={5,10,29,37,39,56,65,88};
    int key = 88;
    cout<<getkey(a,key,0,8);
    return 0;
}

二叉樹遍歷(非遞歸版)

由于遞歸版過(guò)于簡(jiǎn)單深胳,一般來(lái)說(shuō)面試是不會(huì)考的,所以只放非遞歸版铜犬。

  • 節(jié)點(diǎn)定義
// 二叉樹節(jié)點(diǎn)
struct binode{
    int val;
    binode* left;
    binode* right;
    explicit binode(int v){
        val=v;
        left=nullptr;
        right=nullptr;
    }
    binode(int v, binode* l, binode* r){
        val=v;
        left=l;
        right=r;
    }
    void setlrnode( binode* l, binode* r){
        left=l;
        right=r;
    }
    void setlnode( binode* l){
        left=l;
    }
    void setrnode( binode* r){
        right=r;
    }
};

1.先序遍歷

// 先序遍歷
void preorder(binode* root){
    if (root==nullptr) return;
    binode *p=root;
    stack<binode*> s;
    while (p!=nullptr || !s.empty()){
        while (p!= nullptr){
            cout<<p->val;
            s.push(p);
            p=p->left;
        }
        if (!s.empty()){
            p=s.top();
            s.pop();
            p=p->right;
        }
    }
}

2.中序遍歷

中序遍歷就是先序遍歷的cout放到if里面舞终。

// 中序遍歷
void midorder(binode* root){
    if (root==nullptr) return;
    binode *p=root;
    stack<binode*> s;
    while (p!=nullptr || !s.empty()){
        while (p!= nullptr){
            s.push(p);
            p=p->left;
        }
        if (!s.empty()){
            p=s.top();
            cout<<p->val;
            s.pop();
            p=p->right;
        }
    }
}

3.后序遍歷

后續(xù)遍歷很容易出問(wèn)題,之前的寫的會(huì)內(nèi)存泄露癣猾,現(xiàn)在修改了敛劝。

// 后序遍歷
void postorder(binode* root){
    if (root==nullptr) return;
    binode *p=root;
    stack<binode*> s;
    stack<binode*> t;
    while (p!=nullptr || !s.empty()){
        while (p!= nullptr){
            s.push(p);
            t.push(p);
            p=p->right;
        }
        if (!s.empty()){
            p=s.top();
            s.pop();
            p=p->left;
        }
    }
    while (!t.empty()) {
        p=t.top();
        t.pop();
        cout<<p->val;
    }
}

4.層序遍歷

層序遍歷即廣度優(yōu)先搜索,按照每一層的節(jié)點(diǎn)從左到右輸出纷宇,代碼非常簡(jiǎn)單夸盟,用于計(jì)算二叉樹的高度(面試題,今天小米面試被問(wèn)了像捶,沒(méi)想起來(lái))上陕。

// 二叉樹層序遍歷
void layerorder(binode* root){
    if(root== nullptr)
        return;
    binode* p;
    queue<binode*> q;
    q.push(root);
    while (!q.empty()){
        p = q.front();
        q.pop();
        cout<<p->val;
        if(p->left!= nullptr){
            q.push(p->left);
        }
        if(p->right!= nullptr){
            q.push(p->right);
        }
    }
}

5.測(cè)試用例

// 二叉樹測(cè)試
int main()
{
    /* 假設(shè)有二叉樹
          1
         |  \
        2    3
       |  \
      4    5
     |  \
    6    7
  */
    binode* root = new binode(1);
    // 構(gòu)造二叉樹,這樣寫是為了MD可以正常顯示
    binode nd1(2);
    binode nd2(3);
    binode nd3(4);
    binode nd4(5);
    binode nd5(6);
    binode nd6(7);
    root->setlrnode(&nd1,&nd2);
    nd1.setlrnode(&nd3,&nd4);
    nd3.setlrnode(&nd5,&nd6);
    // 遍歷
    preorder(root);
    cout<<endl;
    midorder(root);
    cout<<endl;
    postorder(root);
    cout<<endl;
    layerorder(root);
    return 0;
}

測(cè)試結(jié)果如下:

測(cè)試結(jié)果圖

不定期繼續(xù)更新ing~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拓春,一起剝皮案震驚了整個(gè)濱河市释簿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痘儡,老刑警劉巖辕万,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沉删,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)醉途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門矾瑰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隘擎,你說(shuō)我怎么就攤上這事殴穴。” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵采幌,是天一觀的道長(zhǎng)劲够。 經(jīng)常有香客問(wèn)我,道長(zhǎng)休傍,這世上最難降的妖魔是什么征绎? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮磨取,結(jié)果婚禮上人柿,老公的妹妹穿的比我還像新娘。我一直安慰自己忙厌,他們只是感情好凫岖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逢净,像睡著了一般哥放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爹土,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天婶芭,我揣著相機(jī)與錄音,去河邊找鬼着饥。 笑死犀农,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宰掉。 我是一名探鬼主播呵哨,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轨奄!你這毒婦竟也來(lái)了孟害?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挪拟,失蹤者是張志新(化名)和其女友劉穎挨务,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玉组,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谎柄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惯雳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朝巫。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖石景,靈堂內(nèi)的尸體忽然破棺而出劈猿,到底是詐尸還是另有隱情拙吉,我是刑警寧澤窿祥,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布掏呼,位于F島的核電站,受9級(jí)特大地震影響刊头,放射性物質(zhì)發(fā)生泄漏仗颈。R本人自食惡果不足惜佛舱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揽乱。 院中可真熱鬧名眉,春花似錦、人聲如沸凰棉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撒犀。三九已至福压,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間或舞,已是汗流浹背荆姆。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留映凳,地道東北人胆筒。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像诈豌,于是被迫代替她去往敵國(guó)和親仆救。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容