面試中變相考算法復雜度
阿新 • • 發佈:2017-06-04
節點 邊界條件 mod [0 全局 while 構造過程 算法 pop
分析:假設待刪除節點為最後一個節點,則不能依照以上思路,沒有辦法,僅僅能依照常規方法遍歷,時間復雜度為O(n),是不是不符合題目要求呢?可能非常多人在這就會懷疑
學習心得
1 對於這樣的帶要求的(要求苛刻的)問題,就要求我們不能應用常規的方法來思考它。
2 這樣的題,一般有一些特點,裏面的技巧性非常強。當然也比較easy發現,從遞推公式中能夠看出一些端倪;
3 你用常規的方法書寫時 再加上 從遞推公式中能夠看出一些端倪 應該不難看出它的解法
4 平時一定要多多練習。在自己高速地寫完一個算法題後,想一想有沒有更優的方法,哪怕僅僅有一點點代碼優化;
5 代碼優化,也是在面試的時候面試官,在你寫完代碼後,最愛問的一個問題。
一:題目:給定單向鏈表的頭指針和一個結點指針,定義一個函數在O(1)時間刪除該結點。
鏈表結點與函數的定義例如以下:
struct ListNode { int m_nValue; ListNode* m_pNext; }; void delete_note(ListNode *head,ListNode *current) { // 空的 if(head == null || current==null) { return; } else if(current->m_pNext != null) {// 非結尾 ListNode *tmp = current->m_pNext; current->m_nValue = tmp->m_nValue; current->m_pNext = tmp->m_pNext; delete tmp; tmp = null; } else if(head == current) {// 僅僅有一個節點 delete current; current = null; head = null; } else {// 尾節點,不是一個哦 ListNode *tmp = head; while(tmp->m_pNext != current) tmp = current->m_pNext; tmp->m_pNext = null; delete current; current = null; } }
分析:假設待刪除節點為最後一個節點,則不能依照以上思路,沒有辦法,僅僅能依照常規方法遍歷,時間復雜度為O(n),是不是不符合題目要求呢?可能非常多人在這就會懷疑
自己的思考,從而放棄這樣的思路,最後可能放棄這道題,這就是這道面試題有意思的地方。雖看簡單,可是考察了大家的分析推斷能力,是否擁有強大的心理,充分自信。事實上
我們分析一下,仍然是滿足題目要求的。假設刪除節點為前面的n-1個節點。則時間復雜度為O(1),僅僅有刪除節點為最後一個時,時間復雜度才為O(n),所以平均的時間復雜度
為:(O(1) * (n-1) + O(n))/n = O(1);仍然為O(1)
單向鏈表中刪除一個結點,最常規的方法是從頭到尾掃描一遍找到結點,然後刪除結點。對於給定的是值得結點,沒有辦法僅僅能從頭到尾掃描一個一個對照值得大小,假設鏈表
中存在。則刪除結點。
本題給出的是一個結點的指針,我們無需掃描就能夠得到結點的指針。在這個過程中。僅僅要把當前結點(p)的next結點(q)的值賦給當前結點。把q的
next結點連接到p的next域刪,接下來刪除結點q就滿足題目的要求了。
可是這個題目中存在很多陷阱:首先是邊界條件的考慮。然後是刪除結點的位置,表頭,表尾,和中間,不同的地方刪除時處理不一樣。
二:給定一個數組a[N],我們希望構造數組b[N],當中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。
在構造過程:
1、不同意使用除法;
2、要求O(1)空間復雜度和O(n)時間復雜度。
3、除遍歷計數器與a[N] b[N]外,不可使用新的變量(包含棧暫時變量、對空間和全局靜態變量等);
void makeArray(int a[],int b[],int len) { int i,j; b[0] = 1; for(i=1;i<len;i++) { b[i] = b[i-1]*a[i-1]; //累乘a[0]*a[1]...a[i-1] } b[0] = a[len-1]; for(j=len-2;j>0;j--) { b[j] *= b[0]; b[0] *= a[j]; } }
學習心得
1 對於這樣的帶要求的(要求苛刻的)問題,就要求我們不能應用常規的方法來思考它。
2 這樣的題,一般有一些特點,裏面的技巧性非常強。當然也比較easy發現,從遞推公式中能夠看出一些端倪;
3 你用常規的方法書寫時 再加上 從遞推公式中能夠看出一些端倪 應該不難看出它的解法
4 平時一定要多多練習。在自己高速地寫完一個算法題後,想一想有沒有更優的方法,哪怕僅僅有一點點代碼優化;
5 代碼優化,也是在面試的時候面試官,在你寫完代碼後,最愛問的一個問題。
面試中變相考算法復雜度