1. 鍊錶中的倒數第m個元素
給定乙個單向鍊錶,請設計乙個既節省時間又節省空間的演算法來找出該鍊錶中的倒數第m個元素。實現這個演算法。
「倒數第m個元素」是這樣規定的:當m=0時,鍊錶的最後乙個元素(尾元素)將被返回。
前進m步後啟動乙個「後指標」
2. 空鍊錶和迴圈鍊錶
給定乙個鍊錶,它可能是乙個以"null"結尾的非迴圈鍊錶,也可能是乙個迴圈結構結尾的迴圈鍊錶。寫乙個函式來判斷該鍊錶是乙個迴圈鍊錶還是乙個非迴圈 鍊錶,該函式不得對鍊錶本身做任何修改。
用兩個指標,一快一慢,如果是迴圈鍊錶,快的指標遲早會 超過慢指標,時間複雜度:o(n),最多也是3n
int determinetermination(node *head)
else if(fast == slow || fast->next == slow)
else
}}
1. 樹的遍歷(遞迴+非遞迴)
注意遞迴轉換非遞迴的分析過程。
2. 最低公共祖先
已知二分查詢樹上兩個節點的值,請找出它們的最低公共祖先。你可以假設這兩個值肯定存在。這個函式的呼叫介面如下所示:
int findlowestcommonancestor(node *root, int value1, int value2);
原理:兩個節點的最低公共祖先的值介於兩者之間。
做法:從根節點出發,沿著兩個給定節點的公共祖先前進。當這個兩個節點的值同時小於當前節點的值時,沿左指標前進;當這兩個節點的值同時大於當前節點的值 時,沿右指標前進;當第一次遇到當前節點的值介於兩個給定的節點值之間的情況時,這個當前節點就是我們的目標節點。
1. 第乙個無重複字元
採用的方法是雜湊表或者陣列記錄字元的出現次數,然後再從頭遍歷一次。
2. 顛倒單詞的出現順序
請編寫乙個函式來顛倒單詞在字串裡的出現順序。比如說,你的函式應該把字串"do or do not, there is no try."轉化為"try. no is there not, do or do"。假設所有的單詞都以空格為分隔符,標點符號也當做字母來對待。
除了通用性解法外,可以採用一種專用的解法:交換字元, 頭尾交換,然後再針對每乙個單詞頭尾交換
void reversewords(char str)
//back up to end of word
end--;
//reverse words
reversestring(str, start, end);
}end++; //advance to next token
}return;
}reversestring(char str, int start, int end)
}
1. 位元組的公升序儲存和降序儲存方式
請編寫乙個函式還判斷某計算機的位元組儲存順序是公升序(little-endian)還是降序(big-endian)。
「位元組的儲存順序」指的是多位元組資料的各個位元組在計算機裡的儲存順序。比如說用來表示整數的那4個位元組的順序,其包括兩種,一是按從最低位位元組 (lsb)到最高位位元組(msb)的順序進行儲存;另一種是從msb到lsb的順序進行儲存。這裡說的「高位位元組」指的是字(word)中的高位位元組。如 果位元組表示的是字的低值部分,我們就說它是這個字的lsb。比如說,數值「5a6c」中的lsb就是"6c"。反過來說,「5a6c」中的msb是 「5a」。
在一台採用位元組降序儲存方案的計算機裡,msb將被儲存在最低位的位址裡;在一台採用位元組公升序儲存方案的計算機裡,lsb將被儲存在最低位的位址裡。比如 說,採用位元組降序儲存方案的計算機把十六進製制值「a45c」中的"a4"儲存在第乙個位元組裡,把"5c"儲存在第二個位元組裡;而一台採用位元組公升序儲存方案 的計算機將把「5c」儲存在第乙個位元組裡,把"a4"儲存在第二個位元組裡。
具體到本題中,可以使用字元指標來獲取某個位元組中的內容。
/* return 1 if the machine is little-endian, 0 if the* machine is big-endian
*/int endianness(void)
有一種更精妙的解法,利用了「union」型別:這種型別與 「struct」類似,只是它的所有資料成員都是從記憶體中的同乙個位置開始儲存的。這樣使你能夠把同樣的資料當做不同的變數型別來使用。
/* return 1 if the machine is little-endian, 0 if the* machine is big-endian
*/ int endianness(void)
endiantest;
endiantest.theinteger = 1;
return endiantest.singlebyte;
}
程式設計師面試攻略
1.求職過程 2.程式設計面試題的解答思路 對面試題不清楚的地方一定要問清楚,在編寫 的過程中應隨時向考官解釋你正在做的事情,寫完程式後應該找例子驗證自己寫出來的 對解決方案的複雜性進行分析 3.鍊錶 p21頭指標的修改,用c語言 無法正確改變父函式裡的指標 int badinsert elemen...
程式設計師面試攻略試題1
題目 有乙個單向鍊錶,它的元素全都是整數。head和tail分別是指向該鍊錶第乙個元素和最後乙個元素的全域性性指標。請實現呼叫介面如下所示的兩個c語言函式 int delete element elem int insertafter element elem,int data 分析 這道面試題重點...
程式設計師面試攻略題2
題目 刪除單向鍊錶的頭元素的函式。請找出其中的程式漏洞並加以糾正 void removehead node head 分析 在c語言裡,輸入引數都是以值傳遞的方式進入子函式的,換句話說,子函式所使用的 是輸入引數的乙個區域性副本,對這個區域性副本的修改不可能在該函式以外的地方被 看到 但在c語言裡,...