輕鬆搞定面試中的鏈表題目

著作權,轉載請註明出處,謝謝!http://blog.csdn.net/walkinginthewind/article/details/7393134鏈表是最基本的資料結構,面試官也常常用鏈表來考察面試者的基本能力,而且鏈表相關的操作相對而言比較簡單,也適合考察寫代碼的能力。鏈表的操作也離不開指標,指標又很容易導致出錯。綜合多方面的原因,鏈表題目在面試中佔據著很重要的地位。本文對鏈表相關的面試題做了較為全面的整理,希望能對找工作的同學有所協助。鏈表結點聲明如下:struct ListNode{

求能整除正整數a或b的正整數序列

題目:正整數序列Q中的每個元素都至少能被正整數a和b中的一個整除,現給定a和b,需要計算出Q中的前幾項,例如,當a=3,b=5,N=6時,序列為3,5,6,9,10,12(1)設計一個函數void generate(int a, int b, int N, int *

輕鬆搞定面試中的二叉樹題目

著作權,轉載請註明出處,謝謝!http://blog.csdn.net/walkinginthewind/article/details/7518888樹是一種比較重要的資料結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點(或左孩子和右孩子),並且二叉樹的子樹有左右之分,其次序不能任意顛倒。二叉樹是遞迴定義的,因此,與二叉樹有關的題目基本都可以用遞迴思想解決,當然有些題目非遞迴解法也應該掌握,如非遞迴遍曆節點等等。本文努力對二叉樹相關題目做

二叉尋找樹轉變成有序的雙向鏈表

題目要求:將二叉尋找樹轉換成排序的雙向鏈表,不能建立新節點,只調整指標。尋找樹的結點定義如下:class Node{public: Node(int x):left(NULL),right(NULL),data(x){}; Node * left; Node * right; int

POJ–3160[Father Christmas flymouse] 縮點+SFPA求最長路

思路:(1):先對原圖進行縮點,即把每個強連通分量縮成一個點,其權值為聯通分量裡面所有點的權值之和。(2):縮點後重新構圖,並把每條又向邊上加上權值:sInsert(Belong[u],Belong[v],num[Belong[v]]);(3):然後再重每個入度為零的點s(縮點後)進行SPFA求最長路,並更新答案ans=max(ans,max{dis[i]}+num[s]);(4):最後的ans即是d答案。 CODE:/*縮點+SFPA求最長路*//*AC代碼:63ms*/#include

POJ–3592[Instantaneous Transference] 縮點+求最長路

思路:(1):構完圖縮點然後求最長路(2):注意*號的位置可以選擇不跳(3):資料裡沒有*號跳到#號的情況PS.說實話這題不難,思路和poj3160一樣、、 CODE:/*縮點+求最長路*//*注意:*號的位置可以選擇不跳*//*AC代碼:16ms*/#include <iostream>#include <cstdio>#include <memory.h>#include <queue>#include

HDU–3407[String-Matching Automata] AC自動機或kmp

 思路:弱化的AC自動機,也可以用KMP。 PS.在HDU能AC,在POJ一直WA、、、、  CODE:/*AC自動機或kmp*//*AC代碼:32ms*/#include <iostream>#include <cstdio>#include <memory.h>#include <algorithm>#include <queue>#define MAXN 100006#define kind 26using namespace

POJ–3921[Destroying the bus stations] 最小費用流+拆點

題目大意:一個有向圖有N(N<=50)個點,M(M<=4000)條邊。現在要求刪掉最少的點,使得不存在從1號點到N號點的長度<=K(K<1000)的路徑。當然,不能直接刪掉1號點或N號點。輸出最少需要刪掉的點數(刪掉一個點的時候會將與之相連的邊也刪掉)。PS.不存在一條邊直接連1-N。 思路:最小費用流+拆點 構圖:(1):把[2..N-1]個點拆成i->i+N連一條容量為1費用為0的邊<1,0>;//保證每個點被破壞一次(2):把1和N拆點,連一條&l

PKU 2394—Checking an Alibi

Checking an AlibiTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 3854Accepted: 1384DescriptionA crime has been comitted: a load of grain has been taken from the barn by one of FJ's cows. FJ is trying to determine which of his C (1 <= C

POJ–1947[Rebuilding Roads] 樹形DP

題意:給你一棵樹,讓你求最少剪掉多少條邊可以剪出一棵邊數為p的子樹. 思路:(樹形DP)(1):f[i][j]:表示以i為根(包含i),共j個節點需要切斷的路的數量(2):f[i][j+k]=min(f[i][j+k],f[i.son[t]][k])(t為i的孩子)   CODE:/*AC代碼:0ms*/#include <iostream>#include <cstdio>#include <memory.h>#include

POJ–1639[Picnic Planning] K限度最小產生樹

演算法流程:1.將該點(以下用v0表示)刪除,將得到m個連通分量。2.對每個連通分量求最小產生樹,假設m個。3.從每個連通分量中找與v0關聯的權值最小的邊,與v0相串連,這樣將得到v0的最小m度產生樹4.如果 k  < m 那麼這種樹是不存在的。5.如果 k >=m ,那麼考慮構建 m+1度 最小產生樹 ,將與v0關聯的且不在當前的樹中的邊6.如果將其加入樹中

PKU–1001(hdu 1063)—[Exponentiation] 字串類比

解題思路: 針對資料的特點n<=25普通的大數乘法即可,演算法不難,主要是輸入的處理有點複雜,很容易漏掉!WA的請注意。輸入資料需要考慮R和n的特殊情況!分情況討論:R:1,整數2,小數然後對於每一種情況又分有無前置字元為零,後導零。R:000000 000100R:小數點可以在任意位置如:.00000 000.00 00000.n注意為0的情況!  最佳化前代碼:在PKU能過,在杭電TLE,鬱悶了下(杭電上還是有很多變態資料的....) 最佳化前代碼:POJ Accepted 168K

POJ–1191[棋盤分割] 記憶化搜尋

思路:(具體參考《演算法藝術與資訊學競賽》)1,先化簡均方差公式,可以看出,只需要讓每個分割後的矩形的總分的平方和盡量小,即可使均方差最小。2,考慮左上方座標為(x1,y1),右下角座標為(x2,y2)的棋盤,設它的總和為s[x1,y1,x2,y2]切割k次以後得到k+1塊矩形的總分平方和最小值為d[k,x1,y1,x2,y2],則它可以沿著橫線切,也可以沿著豎線切,然後選一塊繼續切(遞迴)。。3,由1,2部可以得到狀態轉移方程:d[k,x1,y1,x2,y2]=min{min{d[k-1,x1

POJ–2286[The Rotation Game] IDA*

剪枝:每次不要往反方向搜。注意:長度相同要輸出字典序最小的操作PS.一開始是用狀態壓縮+BFS的,結果無情的TLE了、、、  估價函數:int h(int st[])//估價函數{int i,num[4]={0};for(i=0;i<8;i++)num[st[mid[i]]]++;return 8-max(num[1],max(num[2],num[3])); } CODE:/*IDA_star*//*注意長度相同要按輸出字典序最小的*//*AC代碼:172ms*/#include

POJ–3815[The Ninja Way] 差分約束

 題意:給你一排樹,問你最低到最高的最大距離多少?(1)(行走方式:h1->h2->````hn)其中h1到hn嚴格遞增。(2)相鄰(高度相鄰)兩樹的距離要<=D。 思路:差分約束 構圖:(1):相鄰(高度相鄰)兩樹的距離要<=D。for(i=1;i<N;i++){u=Tnode[i].id;v=Tnode[i+1].id;if(u>v)//d[i]-d[i+1]<=DInsert(i+1,i,D);elseInsert(i,i+1,D); } (2):

PKU3629—Card Stacking

純類比題,用鏈表類比.....  原始碼:#include <iostream>struct px{int i;//當前點的值int n;//指向下一點,起串連作用};struct px link[100010];int ans[100010];int main (){int n,k,p,i,j,head,tail;while(scanf("%d%d%d",&n,&k,&p)!=EOF){for(i=1;i<=k;i++)//建立初始鏈{link[i].

HDU–3685[Rotational Painting] 求重心+凸包

穩定的定義:多邊形玻璃板的重心向水平面作垂線時,垂足落在支撐邊所在的線段上(不包括線段端點)。對多邊形支撐邊的枚舉:由於有可能出現凹多邊形,因此可供選擇的“支撐邊”包括該多邊形的凸包的所有邊。 思路:先求重心,然後再求凸包,枚舉凸包的每條邊判斷是否可以是支撐邊。(注意重心到某條支撐邊的交點在端點算不合法)CODE:/*求重心+凸包*//*AC代碼:187ms*/#include <iostream>#include <cstdio>#include

HDU–2066[一個人的旅行] Dijkstra

最短路徑題,套用Dijkstra演算法,但增加一個頂點A連通所有起點,一個頂點B連通所有終點..問題就轉化為A到B的最短路徑D,D再減去A跟B多出來的距離就得到結果..  CODE:#include <iostream>using namespace std;const int INF=99999999;const int MAX=1010;int max(int a,int b){ return a>b?a:b;}int T,S,D,L;int

HDU–3264[Open-air shopping malls] 枚舉圓心+二分半徑

題意:平面上有n個圓,給定他們各自的圓心和半徑。保證任意兩個圓不會互相重疊。現在求一個大圓,它的圓心與某個給定圓的圓心重合,且對於每一個給定的圓,大圓至少覆蓋該圓面積的一半。請求得滿足要求的大圓的最小半徑。演算法流程枚舉圓心位置Oi。二分尋找,求得對於當前圓心位置,滿足要求的最小半徑ri記錄上述所有ri中的最小值,並且輸出結果。 時間複雜度O(n2logn)注意:只有一個點的情況 CODE:/*枚舉圓心+二分半徑*//*AC代碼:0ms*/#include

關於 ++i*–i 問題自己的理解

  #inclued "iostream"using namespace std;int main(){     int i=5;     int result=++i*--i;     cout<<"result="<<result<<endl;     return 0;}初看之下,++i=i+1=6;--i=i-1=5;所以result=5*6=30;但是程式運行之後的結果卻是

總頁數: 61357 1 .... 18270 18271 18272 18273 18274 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.