原创 用兩個隊列實現棧(C++模板)

這個可以和上一篇文章<<用兩個棧實現隊列>>對比着來學習。算法思想很簡單,直接上代碼吧: #include<iostream> #include<queue> using namespace std; template<type

原创 用兩個棧實現隊列(C++模板)

題目:用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數appendTail和deleteHead,分別完成在隊列尾部插入節點和在隊列頭部刪除節點的功能。 思想很簡單,直接上代碼: #include<iostream> #i

原创 KMP 算法圖文詳解

1、暴力匹配算法 假設我們現在面臨這樣一個問題,有一個文本串 S 和一個模式串 P,現在要查找P在S中的位置,那麼應該如何查找呢? 我們很容易就想到暴力匹配的方法,假設現在文本串S匹配到 i 位置,模式串 P 匹配到 j 位置,

原创 單鏈表倒置問題

數組作爲存放同類數據的集合,給我們在程序設計時帶來很多的方便,增加了靈活性。但數組也同樣存在一些弊病。如數組的大小在定義時要事先規定,不能在程序中進行調整,這樣一來,在程序設計中針對不同問題有時需要3 0個大小的數組,有時需要5

原创 單例模式(C++版)

單例模式最初定義出現在《設計模式》(艾迪生維斯理,1994):“保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。” 單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成爲系統中的唯一實例。要實現這一點,可

原创 重建二叉樹以及樹的遍歷

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二

原创 旋轉數組的最小數字

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 算法思想

原创 將字符串中的空格替換,時間複雜度爲0(n)解法

題目:實現一個函數,把字符串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出”We%20are%20happy.” 題目很簡單,直接上代碼 #include<iostream> using namesp

原创 二進制中1的個數

請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。例如把9表示成二進制是1001,有2位是1。因此,如果輸入9,該函數輸出2。 下面介紹三種解法,並分析優缺點: 解法一:先判斷整數二進制表示中最右邊一位是不是1.

原创 哈希表算法實現

1、什麼是Hash? Hash,一般翻譯做“散列”,也有直接音譯爲“哈希”的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值

原创 快速排序詳解

快速排序的描述: 分解:數組A[p..r]被劃分爲兩個(可能爲空)子數組A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一個元素都小於等於A[q],A[q+1..r]中的每一個元素都大於等於A[q]。其中,計算

原创 二維數組中的查找

題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣一個二維數組和一個整數,判斷數組中是否含有該整數。 例如下面的二維數組就是每行,每列都遞增排序。如果在這個數組

原创 合併兩個排序的鏈表

程序算法思想很簡單,不作過多的介紹,直接上核心代碼: typedef struct ListNode{ int m_nValue; ListNode* m_pNext; }; //遞歸解法 ListNode* Me

原创 調整數組順序使奇數位於偶數前面

算法思想很簡單: 我們定義兩個指針,第一個指針初始化時指向數組的第一個數字,它只向後移動。第二個指針初始化時指向數組的最後一個數字,它只向前移動。在兩個指針相遇之前,第一個指針總是位於第二個指針的前面。如果第一個指針指向的數字是

原创 劍指offer面試題之賦值運算符函數

題目:如下爲類型CMyString 的聲明,請爲該類型添加賦值運算符函數 class CMyString { public: CMyString(char* pData=NULL); CMyString(