內容會持續更新,有錯誤的地方歡迎指正,謝謝!
資料結構有這幾類:陣列、字串、鍊錶、樹、棧、佇列。
其中,陣列和字串都是用的連續記憶體,陣列中裝數字,字串中裝字元,這兩個都是面試中出現頻率最高的資料結構;鍊錶和樹需要大量指標,特別考察**的魯棒性;棧與遞迴緊密相關,佇列與bfs緊密相關。
陣列的時間效率高,空間效率低。為了解決陣列空間效率低的問題,人們又實現了多種動態陣列,比如:stl中的vector。
當陣列作為函式的引數進行傳遞時,陣列就自動退化為指標。
在面試的時候,一定要展示敏捷的思維能力、追求完美的激情、不怕困難的態度。
如何展示敏捷的思維能力:一般看到一道題都會馬上有最直觀的演算法,一般不是最優的,但不妨告訴面試官,這樣至少給人一種思維敏捷的印象。
如何才能有追求完美的激情:當想出幾種思路之後,面試官可能仍然不滿意,還在提示有更好的辦法,這時我們不要輕言放棄,而要有積極思考的態度,努力從不同角度去思考問題。
有些題目真的很難,但他希望看到應聘者能夠有激情、有耐心地去嘗試新思路,而不是碰到難題就退縮。
在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
法一:先排序,再從排序的陣列中找重複的數字,時間複雜度為o(nlogn)
法二:需要o(n)的空間來記錄,o(1)的時間便可判斷是否已包含重複數字
法三:這是最好的方法。若不存在重複的數字,那每個下標對應的數字 和 下標值 相等,也就是說a[i]=i。由此,以陣列為例,從下標為0開始,第乙個數字2不等於下標0,就把數字2 和 下標為2的數字1 交換,得到陣列;再從下標為0開始,再把數字1和下標為1的數字3交換,得到陣列;再從下標為0開始,同理,得到陣列;再從下標為0開始,符合要求,下標0,1,2,3都符合;下標為4時,數字2 和 下標為2的數字2 相等,則輸出2。
bool duplicate(int numbers, int
length, int* duplication)
int temp;
for(int i=0;i
//交換,一定要注意
temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
//不能像下方這樣寫
//temp=numbers[i];
//numbers[i]=numbers[numbers[i]];
//numbers[numbers[i]]=temp;}}
return
false;
}
儘管上述方法中有兩重迴圈,但每個數字交換的次數可以為:0次、1次、2次就可找到屬於他自己的位置,所以,總的時間複雜度是o(n),以及o(1)的空間複雜度。
不修改陣列找出重複的數字
在乙個長度為n+1的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但是不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。
法一:需要o(n)的空間來記錄,o(1)的時間便可判斷是否已包含重複數字
法二:二分思想,根據前後兩部分的個數進行判斷:根據中間的數字m把1~n分為兩部分,前一半為1~m,後一半為m+1~n。如果1~m的數字的數目大於m,那麼前一半中一定包含重複的數字;否則,後一半中一定包含重複的數字。接下來,我們可以繼續把包含重複的數字的區間一分為二,直到找到乙個重複的數字。具體的邏輯,讀者慢慢去思考動手吧。
小訣竅
根據上面兩題,如果面試官提出不同的功能要求(找出任意乙個重複陣列、找出所有重複數字)或者效能要求(時間效率優先、空間效率優先),那麼我們最終選取的演算法也將不同。這說明在面試中和面試官交流的重要性,所以,問清再寫!
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
思路:首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束;如果該數字大於要查詢的數字,剔除這個數字所在的列;如果該數字小於要查詢的數字,剔除這個數字所在的行。也就是說如果要查詢的數字不在陣列的右上角,則每一次都在陣列的查詢範圍中剔除一行或者一列,這樣每一步都可以縮小查詢的範圍,直到找到要查詢的數字,或者查詢範圍為空。如圖:
(矩陣中加陰影背景的區域是下一步查詢的範圍)
當然,也可以從左下角開始,**如下:
bool find(int target, vector
>
array)
if(array[i][j]>target)
if(array[i][j]continue;}}
return
false;
}
小訣竅當問題比較複雜時,可以通過具體的例子找出其中的規律,如上分析流程圖所示。
學會了上述一維陣列和二維陣列的兩類題,其他陣列的題型迎刃而解了。
Codeforces 字尾陣列 題目彙總
模板1 字串從0開始讀入 const int n 2e5 10,inf 0x3f3f3f3f int sa n int rk n int tmp n int lcp n char s n t n int n,k bool cmp int i,int j void get height 123d.st...
演算法 相關題目彙總(持續更新)
餘初學演算法,題目較易,望諸大神指正而勿噴。一 將乙個正整數分解質因數。例如 輸入90,列印出列印出90 2 3 3 5。static void main string args n 確保列印出 n for i 2 i n i i n i 將n整除i後的值繼續賦給n,來尋找下乙個質因數。如果不用整除...
PHP陣列相關函式彙總
這裡包括函式名和用法說明,沒有詳細的 範例。感興趣的朋友可以查閱本站相關的函式用法。陣列的相關處理函式 current 陣列名稱 輸出陣列中乙個字串的值,從第乙個起.key 陣列名稱 輸出陣列中乙個下標,從第乙個起.next 陣列名稱 控制陣列指標向後移動.prev 陣列名稱 控制陣列指標向前移動....