1. 程式人生 > >挑戰資料結構與演算法面試題——80題全解析(三)

挑戰資料結構與演算法面試題——80題全解析(三)

題目來源“資料結構與演算法面試題80道”。這是第三部分,包含其中的第11題到第15題。
在此給出我的解法,如你有更好的解法,歡迎留言。

這裡寫圖片描述

問題分析:涉及的知識點是二叉樹的遍歷,遍歷的方法主要有:

  • 先序遍歷
  • 中序遍歷
  • 後序遍歷
  • 層次遍歷

在本題中,使用先序遍歷的方法。

方法:

void m_length(BSTreeNode *root, int *length, int *max_length){
    if (NULL == root ||
        (NULL == root->m_pLeft && NULL == root->m_pRight)){
        if
((*length) > (*max_length)) (*max_length) = (*length); return; } (*length) ++; m_length(root->m_pLeft, length, max_length); (*length) --; (*length) ++; m_length(root->m_pRight, length, max_length); (*length) --; }

這裡寫圖片描述

問題分析:可以使用類的構造方法,在類的每次例項化物件時都會呼叫構造方法,那麼只需要例項化n個物件,就會呼叫n次構造方法,這就模擬了迴圈的過程,此時,只需要有一個全域性變數記錄累加的值即可。

方法:

#include <stdio.h>

class calnum{
    public:
        calnum(){
            n ++;
            sum += n;
        }
        ~calnum(){}

        int get_num(){
            return sum;
        }
    private:
        static int sum;
        static int n;
};

int calnum::sum = 0;
int calnum::n = 0
; int main(){ // 宣告n個物件 calnum *sum = new calnum[100]; printf("%d\n", sum->get_num()); delete[] sum; return 1; }

這裡寫圖片描述

問題分析:遍歷一遍連結串列的時間複雜度為O(n),但是連結串列節點的遍歷只能按順序遍歷,問題中是需要取到倒數第k個,最直接的想法是遍歷兩遍連結串列,第1遍得到連結串列的長度,第2遍是取到倒數第k個;那麼能否只遍歷一遍就能取到倒數第k個節點,最關鍵的點是需要確定連結串列的長度,我們可以使用雙指標的方法:第一個指標用於遍歷整個連結串列,第二個連結串列用於遍歷部分連結串列,第一個指標比第二個指標多走k步,當第一個指標遍歷完連結串列,第二個指標所指的即為倒數第k個數,如下圖所示:

這裡寫圖片描述

方法:

ListNode* get_reverse_k(ListNode *head, int k){
    if (NULL == head) return NULL;

    ListNode *p = head;
    ListNode *q = head;
    int step = 0;
    while (NULL != p->m_pNext){
        if (step >= k){
            q = q->m_pNext;
        }
        p = p->m_pNext;
        step ++;
    }
    if (step < k) return NULL;
    else return q;
}

這裡寫圖片描述

問題分析:時間複雜度為O(n),即只能遍歷一次陣列,考慮到陣列是排好序的,考慮從頭部和從尾部同時向陣列的中部遍歷,假設i從頭部遍歷,j從尾部開始遍歷:

  • 如果a[i] + a[j] == num,直接返回;
  • 如果a[i] + a[j] > num,應該減小其和的值,則減小j;
  • 如果a[i] + a[j] < num,應該增大其和的值,則增加i;

方法:

void get_sum(int *a, int length, int n){
    if (NULL == 0 || length <= 0) return;

    int start = 0;
    int end = length - 1;
    while (start < end){
        if (a[start] + a[end] == n){
            printf("%d,%d\n", a[start], a[end]);
            break;
        }else if (a[start] + a[end] > n){
            end --;
        }else{
            start ++;
        }
    }
}

這裡寫圖片描述

問題分析:實質上仍然是二叉樹的遍歷,上述已經介紹過二叉樹的不同的遍歷方法,當遍歷到每一個節點的時候,交換其左右子樹,依次下去,直到葉子節點。

方法:

1、遞迴的方法:

void tree_swap(BSTreeNode *root){
    BSTreeNode *p_tmp = root->m_pLeft;
    root->m_pLeft = root->m_pRight;
    root->m_pRight = p_tmp;
}

void tree_mirror(BSTreeNode *root){
    if (NULL == root ||
        (NULL == root->m_pLeft && NULL == root->m_pRight)){
        return;
    }

    tree_swap(root);
    tree_swap(root->m_pLeft);
    tree_swap(root->m_pRight);
}

2、迴圈的方法

void tree_mirror_loop(BSTreeNode *root){
    if (NULL == root ||
        (NULL == root->m_pLeft && NULL == root->m_pRight)){
        return;
    }

    BSTreeNode *p = root;
    queue<BSTreeNode *> q_tree;
    q_tree.push(p);
    while (! q_tree.empty()){
        BSTreeNode *q = q_tree.front();
        q_tree.pop();
        if (NULL != q->m_pLeft || NULL != q->m_pRight){
            tree_swap(q);
        }
        if (NULL != q->m_pLeft) q_tree.push(q->m_pLeft);
        if (NULL != q->m_pRight) q_tree.push(q->m_pRight);
    }
}

相關推薦

挑戰資料結構演算法試題——80解析

題目來源“資料結構與演算法面試題80道”。這是第三部分,包含其中的第11題到第15題。 在此給出我的解法,如你有更好的解法,歡迎留言。 問題分析:涉及的知識點是二叉樹的遍歷,遍歷的方法主要有: 先序遍歷 中序遍歷 後序遍歷 層次遍歷 在本題中,使用先序遍歷的方法。 方法:

挑戰資料結構演算法試題——統計上排數在下排出現的次數

題目來源“資料結構與演算法面試題80道”。在此給出我的解法,如你有更好的解法,歡迎留言。 分析: 本題應該是一個確定的問題,即上排的是個數是題目中給定的十個數。 其基本的解題過程為:

資料結構演算法試題80

40.百度研發筆試題 引用自:zp155334877 1)設計一個棧結構,滿足一下條件:min,push,pop操作的時間複雜度為O(1)。 2)一串首尾相連的珠子(m個),有N種顏色(N<=10), 設計一個演算法,取出其中一段,要求包含所有N中顏色,並使長度最短。

資料結構演算法試題

由於這些題,實在太火了。所以,應廣大網友建議要求,在此把之前已整理公佈的前80題, 現在,一次性分享出來。此也算是前80題第一次集體亮相。 此些題,已有上萬人,看到或見識到,若私自據為己有,必定為有知之人識破,付出代價。 所以,作者宣告: 本人

挑戰資料結構演算法試題——連續最長數字串

題目來源“資料結構與演算法面試題80道”。在此給出我的解法,如你有更好的解法,歡迎留言。 問題分析:字串的處理,判斷每一位是不是數字,用到了函式isdigit 方法: int co

資料結構演算法 python語言描述》學習筆記————緒論

第一部分:學習內容概要 程式開發過程 問題求解 演算法和演算法分析 資料結構 第二部分:學習筆記 程式開發過程   框架圖 分析,嚴格化——設計——編碼——檢查,翻譯——測試/除錯   牛頓迭代法      0.對給定正實數x和允許誤差e,令變數y取

資料結構演算法 python語言描述》學習筆記————抽象資料型別和Python類

第一部分:學習內容概要 抽象資料型別 Python的類 第二部分:學習筆記 抽象資料型別   1.抽象資料型別(Abstract Data Type,ADT),通過一套介面闡述說明這一程式部分的可用功能,但不不限制功能的實現方法。      2.抽象資料型

考研資料結構演算法----單鏈表的建立和讀取1

    先來個簡單的,晚上再把整表刪除神馬的加上,懶得註釋了,貼出來就是給同樣考研的同志們做個參考。     話說現在大學折騰的越來越水,當年我們學資料結構的時候單鏈表就算是五個實驗裡面第二難的了,最難的是一個二叉樹的,最後反正是都沒做出來直接往上抄的。其實現在回頭看過來倒

資料結構演算法】 棧——棧的應用舉例3例

根據“後進先出”特性,生活中的例子比比皆是。 1數制轉換 假設要講十進位制轉換為二進位制。以 52 為例,如圖: 在上述計算過程中,第一次求出的X值為最低位,最後一次求出的X值為最高位。而列印時

資料結構演算法之排序詳解 一點課堂多岸學院

通過前面的知識,我們已經知道,有序的資料在查詢時有極大的效能提升。很多查詢都基於有序資料,但並不是所有的結構都能像二叉排序樹一樣,

Android 試題總結之Android 基礎

Android 面試題總結之Android 基礎Broadcast Receiver(三) 在上一章節Android 面試題總結之Android 基礎ContentProvider(二) 我們講的ContentProvider和Intent基礎知識。本節

試題總結——JAVA高階工程師

三、面試題基礎總結 1、 JVM結構原理、GC工作機制詳解 答:具體參照:JVM結構、GC工作機制詳解     ,說到GC,記住兩點:1、GC是負責回收所有無任何引用物件的記憶體空間。 注意:垃圾回收回收的是無任何引用的物件佔據的記憶體空間而不是物件本身,2、GC回收

試題總結-資料結構演算法

排序 氣泡排序-比較交換 快速排序-劃分-比較交換-遞迴 選擇排序-選擇-比較交換 查詢 二分查詢 二叉樹 二叉樹的前序、中序、後序遍歷(遞迴實現) 二叉樹的前序、中序、後序遍歷(非遞迴實現) 判斷一棵樹是否為二叉平衡樹 連結串列 連結串列的翻轉 判斷

資料結構演算法-----常問試題

資料結構 陣列 尋找陣列中第二小的元素 找到陣列中第一個不重複出現的整數 合併兩個有序陣列 重新排列陣列中的正值和負值 棧 使用棧計算字尾表示式 對棧的元素進行排序 判斷表示式是否括號平衡 佇列 使用隊列表示棧 對佇列的前k個元素倒序 使用佇列生成從1到n

資料結構演算法1連結串列,基於Python解決幾個簡單的試題

最近頭一直很大,老闆不停地佈置各種任務,根本沒有時間幹自己的事情,真的好想鼓起勇氣和他說,我以後不想幹這個了,我文章也發了您就讓我安安穩穩混到畢業行不行啊……作為我們這些想要跨專業的人來說,其實很大的一個劣勢就是沒有經歷過一個計算機學科完整的培養,所以對計算機專業的一些很基本

基礎試題資料結構演算法

資料結構 資料結構是對實際問題中的資料元素及相互間的聯絡的抽象。一般用線性表來表示常用資料結構,線性表分為順序儲存的順序表和連式儲存的連結串列。 常用資料結構 在學習演算法之前,必須要了解一些常用資料結構的概念。 棧:一種特殊串聯形式的抽象資料型別,可由連結串列或陣列實現,通過連結串列或陣列的

挑戰程式設計競賽2 資料結構演算法學習筆記

例題 有一組n個數,求在這組數中 str[j]-str[i] 的最大值,且j>i., 2<n<20000。 我最初的思路是, max=0;  for(i=0;i<n;i++) {   for(j=0;j<i;j++)    {       i

資料結構演算法 試題答案

一、判斷題: 1、線性表的邏輯順序與物理順序總是一致的。(   ) 2、線性表的順序儲存表示優於鏈式儲存表示。(   ) 3、線性表若採用鏈式儲存表示時所有結點之間的儲存單元地址可連續可不連續。(   ) 4、二維陣列是其陣列元素為線性表的線性表。(   ) 5、每種資料結構都應具備三種基本

為什麼我要放棄javaScript資料結構演算法第一章—— JavaScript簡介

資料結構與演算法一直是我算比較薄弱的地方,希望通過閱讀《javaScript資料結構與演算法》可以有所改變,我相信接下來的記錄不單單對於我自己有幫助,也可以幫助到一些這方面的小白,接下來讓我們一起學習。 第一章 JavaScript簡介 眾所周知,JavaScript是一門非常強大的程式語言,不僅可以用於

資料結構演算法 二分法查詢【PythonC】的實現

程式碼如下: Python: def ErFen(List ,Number ,Len): left = 0 high = Len - 1 while left <= high: mid = (left + high)//2