程式設計筆試題

2021-04-21 10:58:24 字數 3928 閱讀 4468

單向鍊錶的反轉是乙個經常被問到的乙個面試題,也是乙個非常基礎的問題。比如乙個鍊錶是這樣的: 1->2->3->4->5 通過反轉後成為5->4->3->2->1。最容易想到的方法遍歷一遍鍊錶,利用乙個輔助指標,儲存遍歷過程中當前指標指向的下乙個元素,然後將當前節點元素的指標反轉後,利用已經儲存的指標往後面繼續遍歷。源**如下:

struct linka ;

void reverse(linka*& head)

head->next = null;

head = pre;

}

還有一種利用遞迴的方法。這種方法的基本思想是在反轉當前節點之前先呼叫遞迴函式反轉後續節點。源**如下。不過這個方法有乙個缺點,就是在反轉後的最後乙個結點會形成乙個環,所以必須將函式的返回的節點的next域置為null。因為要改變head指標,所以我用了引用。演算法的源**如下:

linka* reverse(linka* p,linka*& head)

else

}

給定兩個排好序的陣列,怎樣高效得判斷這兩個陣列中存在相同的數字?

這個問題首先想到的是乙個o(nlogn)的演算法。就是任意挑選乙個陣列,遍歷這個陣列的所有元素,遍歷過程中,在另乙個陣列中對第乙個陣列中的每個元素進行binary

search。用c++實現**如下:

bool findcommon(int a,int size1,int b,int size2)

}return max;

}

那怎樣才能達到線性複雜度呢?這裡運用動態規劃的思想。先看一下源**實現:

int max_sub2(int a, int size)

return max;

}

在這一遍掃瞄陣列當中,從左到右記錄當前子串行的和temp_sum,若這個和不斷增加,那麼最大子串行的和max也不斷增加(不斷更新max)。如果往前掃瞄中遇到負數,那麼當前子串行的和將會減小。此時temp_sum

將會小於max,當然max也就不更新。如果temp_sum降到0時,說明前面已經掃瞄的那一段就可以拋棄了,這時將temp_sum置為0。然後,temp_sum將從後面開始將這個子段進行分析,若有比當前max大的子段,繼續更新max。這樣一趟掃瞄結果也就出來了。

這道題和解判斷鍊錶是否存在環

,我用的是非常類似的方法,只不過結束迴圈的條件和函式返回值不一樣罷了。設定兩個指標p1,p2。每次迴圈p1向前走一步,p2向前走兩步。當p2到達鍊錶的末尾時,p1指向的時鍊錶的中間。

link* mid(link* head)

while(p2 && p2->next);

return p1;

}

並不是簡單的字串反轉,而是按給定字串裡的單詞將字串倒轉過來,就是說字串裡面的單詞還是保持原來的順序,這裡的每個單詞用空格分開。例如:

here

is www.zhuxinquan.com

經過反轉後變為:

www.zhuxinquan.com is

here

如果只是簡單的將所有字串翻轉的話,可以遍歷字串,將第乙個字元和最後乙個交換,第二個和倒數第二個交換,依次迴圈。其實按照單詞反轉的話可以在第一遍遍歷的基礎上,再遍歷一遍字串,對每乙個單詞再反轉一次。這樣每個單詞又恢復了原來的順序。

char* reverse_word(const char* str)

;bool isloop(link* head)

do while(p2 && p2->next && p1!=p2);

if(p1 == p2)

return true;

else

return false;

問題:乙個動態長度可變的數字序列,以數字0為結束標誌,要求將重複的數字用乙個數字代替,例如:

將陣列

1,1,1,2,2,2,2,2,7,7,1,5,5,5,0 轉變成1,2,7,1,5,0

問題比較簡單,要注意的是這個陣列是動態的。所以避免麻煩我還是用了stl的vector。

#include #include using namespace std;

//remove the duplicated numbers in an intger array, the array was end with 0;

//e.g. 1,1,1,2,2,5,4,4,4,4,1,0 --->1,2,5,4,1,0

void static remove_duplicated(int a, vector& _st)

}

當然如果可以改變原來的陣列的話,可以不用stl,僅需要指標操作就可以了。下面這個程式將修改原來陣列的內容。

void static remove_duplicated2(int a)

else

current++;

} a[insert]=0;

}

我沒有記錯的話是一道msn的筆試題,網上無意中看到的,拿來做了一下。題目是這樣的,給定乙個字串,乙個這個字串的子串,將第乙個字串反轉,但保留子串的順序不變。例如:

輸入:

第乙個字串: "this is zhuxinquan's chinese site: http://www.zhuxinquan.com/cn"

子串:

"zhuxinquan"

輸出: "nc/moc.zhuxinquan.www//:ptth :etis esenihc s'zhuxinquan si

siht"

一般的方法是先掃瞄一邊第乙個字串,然後用stack把它反轉,同時記錄下子串出現的位置。然後再掃瞄一遍把記錄下來的子串再用stack反轉。我用的方法是用一遍掃瞄陣列的方法。掃瞄中如果發現子串,就將子串倒過來壓入堆疊。

最後再將堆疊裡的字元彈出,這樣子串又恢復了原來的順序。源**如下:

#include #include #include using namespace std;

//reverse the string 's1' except the substring 'token'.

const char* reverse(const char* s1, const char* token)

if(*ptoken == '/0')//contain the token

else

}char * return_v = new char[strlen(s1)+1];

int i=0;

while(!stack1.empty())

return_v[i]='/0';

return return_v;

}int main(int argc, char* argv)

}

下面是利用遞迴判斷左右子樹的深度是否相差1來判斷是否是平衡二叉樹的函式:

templatestatic bool isbalance(bstreenode* pbs)

strstr(s1,s2)是乙個經常用的函式,他的作用就是在字串s1中尋找字串s2如果找到了就返回指標,否則返回null。

下面是這個函式的乙個簡單實現:

static const char* _strstr(const char* s1, const char* s2)

}return null;

}

求最大公約數

用輾轉相除法:  

int   f(int   x,   int   y)  

else  

while(m   %   n   !=   0)  

return   n   ;  

}  

網路程式設計筆試題

1.iso osi的七層模型是什麼?tcp udp是屬於哪一層?tcp udp有何優缺點?答 分為下面7層 應用層,表示層,會話層,運輸層,網路層,物理鏈路層,物理層 tcp udp屬於運輸層 tcp 服務提供了資料流傳輸 可靠性 有效流控制 全雙工操作和多路復用技術等。與 tcp 不同,udp並不...

程式設計基礎筆試題

1.在c 中,類的靜態成員 static member 必須在類內宣告,在類外初始化 class a int a count 0 類外初始化,不必再加static關鍵字2.對於 char p new char 100 p為指標,指向空間,在棧上,new是動態記憶體分配,new出來的空間在堆上,在堆上...

Socket程式設計步驟(筆試題)

問 socket程式設計執行send之後系統進行哪種操作?答 如果採用系統是採用阻塞模式,則系統執行send之後會等待對方返回結果才執行下一步。如果是非阻塞模式則將當前執行緒掛起,執行系統下乙個操作。問 什麼是粘包?答 出現粘包現象的原因是多方面的,它既可能由傳送方造成,也可能由接收方造成。傳送方引...