Time of Update: 2018-12-05
這個以前寫過,見求數組的最長子數組之和的最大值這裡說一下後面擴充題目。1. 簡述 1) 如果數組首尾相連,即允許找到一組數字(A[i],···,A[n-1], A[0],···, A[j]),請使其和最大,怎麼辦? 2) 如果題目要求返回最大子數組的位置,演算法應該如何改變?還能保持O(N)的複雜度嗎?2. 思路
Time of Update: 2018-12-05
1. 簡述 原題:簡略的說,就是一個ID列表,其中每個ID都可能重複出現,其中一個ID的重複出現個數超過了列表長度的一半。要求快速找到這個ID。 擴充:ID列表中,有三個ID,這三個ID重複出現的次數,都超過了列表長度的1/4。要求快速找到這個ID。2. 思路 原題的思路還是編程之美上面的方法,擴充題目的方法是參考中的一篇文章中講過。
Time of Update: 2018-12-05
1. 簡述 假設有一個沒有頭指標的單鏈表。一個指標指向此單鏈表中間的一個節點(不是第一個,也不是最後一個節點)。請將該節點從單鏈表中刪除。 擴充題目:給定一個鏈表頭指標,將單鏈表逆置。2. 思路 對於第一個問題,首先把要刪除的節點內容交換到後面節點上去,然後將後面的節點刪除。注意,如果當前刪除的節點是最後一個節點的時候,是無法搞定的。assert(Curr!=NULL && Curr->Link != NULL);swap(Curr->value,
Time of Update: 2018-12-05
1. 簡述 從一個字串中,刪除另一個字串中出現過的所有字元。基本上比較簡單,主要就是要儲存的字元放到合適的位置,要刪除的字元最後要釋放掉,還有就是'\0'的處理。2.
Time of Update: 2018-12-05
1. 簡述 使用兩個字串之間的編輯距離計算它們的相似性,相似性=1/(編輯距離+1)。兩個字串的編輯距離:指通過下面三種操作可以將兩個字串變為相同的字串需要的次數。1) 修改一個字元 2) 增加一個字元 3) 刪除一個字元。 對於"abcdefg"和"abcdef"兩個字串來說,我們認為可以通過增加/減少一個"g"的方式來達到目的,將兩個字串變成相同字串的最小步數為1,因此編輯距離為1,相似性=1/(1+1)=0.5。 給定兩個字元,編程實現計算它們的相似性。2. 思路
Time of Update: 2018-12-05
1. 簡述 SVM涉及的東西很多,如果要理解全面的話,要理解經驗風險與置信風險,VC維理論,推匯出最佳化公式,最佳化求解的拉格朗日解法,核函數,等等方面的內容,當前對SVM理解太少,平時主要使用其工具包,這裡記錄一下推匯出SVM最佳化公式的部分,主要參考是維基百科,感覺維基百科在這部分的說明比較清楚簡單。2. 推導 ·
Time of Update: 2018-12-05
1. 簡述 本文主要說明兩點,第一,對於基礎資料型別 (Elementary Data Type),delete和delete[]在釋放數組上是一樣的,至少結果上看是一樣的。第二,堆記憶體位址分配大多數情況是無法預測的,而棧是更容易預測。2. delete與delete[]
Time of Update: 2018-12-05
1. 簡述 最近打算複習一下,幾個經典的樹結構,本文主要關注二叉搜尋樹,英文名稱為Binary Search Tree (簡稱BST)。 本文主要總結二叉搜尋樹的尋找演算法、插入演算法和刪除演算法。2. 尋找演算法
Time of Update: 2018-12-05
1. 簡述 類的成員變數多種多樣,比如:int a, const int a, int &a, static int a, static const int a, statice int& a。前面三個分別是普通變數、const變數和引用變數,後面的三個是前面三個分別加上了static。本文主要分析這六種變數初始化的位置。2. 說明 對於int、const
Time of Update: 2018-12-05
1. 簡述 寫一個程式,求兩個正整數的最大公約數。如果兩個正整數很大,有什麼簡單的方法嗎?2. 思路 這個書上總結的很全了已經。 輾轉相除法,設f(x,y)表示x與y的最大公因子,如果x=y*k+z,z>0,那麼f(x,y)=f(y,z),如果x=y*k+z,z=0,那麼f(x,y)=y,即此時x可以整除y。比如f(6,4)=f(4,2)=2,f(24,18)=f(18,6)=6。 改進方法,當正整數很大的時候,大數除法比較消耗時間,這裡規避大數的除法運算。
Time of Update: 2018-12-05
1. 簡述 寫一個時間複雜度儘可能低的程式,求一個一維數組中最長遞增子序列的長度。 例如在序列1,-1,2,-3,4,-5,6,-7中,其最長的遞增子序列的長度為4(如1,2,4,6)。2. 思路
Time of Update: 2018-12-05
1. 下面程式輸出是多少?Union U { char str[2]; short int num;};int main() { U u; u.str[0] = 10; u.str[1] = 1; cout << u.num << endl; system("PAUSE"); return 0;} 結果為266。對於整數類型,都是低位元組存低位,高位元組存高位,因此低位是10,高位是1,結果=1*256+10=266。2.
Time of Update: 2018-12-05
1. 簡述 簡單的說就是有很多很多數值,多到記憶體放不下,要求選取其中最大的若干個數值。2. 原理 赤裸裸的TOP-K問題,比如求前100大的數值,維護一個100大小的最小堆,首先讀100個元素,初始化這個最小堆,然後,每讀取一個數值,根堆的數值比較一下,如果當前數值小於等於堆頂數值,那麼繼續遍曆好了,如果當前數值大於堆頂數值,那麼將對堆頂元素改為當前數值,然後更新一下堆,接著繼續遍曆就好了。另外也可以維護一個100個元素長度的有序數組,每次就是二分插入法。複雜度一般就是N*log1
Time of Update: 2018-12-05
1. 簡述 本文主要說明一些常用的內部排序演算法的分類、複雜性和穩定性。主要基於現在的理解和學習,詳細準確的複雜度可以參見維基百科等比較權威的網站,對於一些演算法的不同實現,複雜度也不同,這裡給出的複雜度都是相對較好的演算法的複雜度。2. 分類 3. 複雜性和穩定性 冒泡排序:在已經有序的情況,取得O(N)的複雜度。 快速排序:每次遞迴都是N的複雜度,遞迴次數根據序列有關係,當已經有序的情況下,遞迴N次,時間複雜度為O(N*LogN)
Time of Update: 2018-12-05
1. 簡述 給定一個十進位正整數N,寫下從1開始,到N的所有整數,然後數一下其中出現的所有'1'的個數。例如:N=2,寫下1,2.這樣只出現了1個'1',N=12,我們會寫下1,2,3,4,5,6,7,8,9,10,11,12,這樣1的個數是5。 兩個問題: 1. 寫一個函數f(N)。返回1到N之間出現的'1'的個數,比如f(12)=5。 2. 滿足條件f(N)=N的最大的N是多少? 2.
Time of Update: 2018-12-05
1. 簡述 注意下標、參數傳遞。只要把二維中下標,轉化為一維數組的下標即可。2. 核心代碼 二維的公式是:c[i][j] += a[i][k] * b[k][j], k=0,1,2,...,N-1 一維的公式: c[i*N+j] += a[i*N+k] * b[k*N+j],
Time of Update: 2018-12-05
1. 簡述 主要的場合有四類:初始化對象成員,初始化基類的成員,初始化const成員,初始化引用成員。對於const成員和引用成員,比較簡單,這兩種變數都要求初始化後不能賦值,因此,只能在成員初始化列表中進行初始化,其他地方不行。本文主要介紹初始化對象成員和初始化基類成員這兩種情況。 2. 初始化對象成員
Time of Update: 2018-12-05
1. 簡述 設計一個演算法,把一個含有N個元素的數組迴圈右移K位,要求時間複雜度為O(N),且只允許使用兩個附加變數。2. 思路 其實看到題目中只允許兩個附加變數應該也能想到,就是兩個變數倒來倒去就行了。如果熟悉希爾排序的話,這題不是問題,希爾排序裡面需要分組進行插入法排序,這裡就是分組進行移位而已。 舉例先說明下,假設10個元素,要移動3位,那麼就是三組,第一組:A[0],A[3],A[6],A[9],第二組:A[1],A[4],A[7],第三組A[2],A[5],A[8],
Time of Update: 2018-12-05
1. 簡述 簡單的說就是將有限迴圈小數和無限迴圈小數轉化為分數形式。比如: 0.9 = 9/10 0.333(3) = 1/3,其中括弧表示迴圈節。2. 思路 書上的方法就是分情況討論。
Time of Update: 2018-12-05
1. 簡述 給出兩個鏈表的頭指標,比如h1,h2,判斷這兩個鏈表是否相交。這裡是為了簡化問題,我們假設兩個鏈表不帶環。 擴充:如果鏈表可能有環呢? 擴充:如何求出兩個相交鏈表的相交的第一個節點。2. 分析 這道題,個人感覺理解的還是相對比較清楚完整。主要就是兩個問題,問題一,兩個鏈表是否相交,問題二,兩個鏈表如果相交,求得相交第一個節點。