一些算法题
?? 例如去掉2,4,得到135,去掉1,5,得到234。設計算法,求出所有得到的
?? N-k位數里面最小的那一個
從左到右掃描,并將數字放入vector,當遇到一個數比前面的數小的時候,刪除前面的數,并繼續和vector最后的一個元素比,如果還是比最后一個元素小,繼續刪除這最后一個數,直到比最后一個數大。然后,繼續向右掃描。直至刪到的數的位數為k
2.N個人中只有一個明星:明星不認識其他所有的人,而其他人都認識明星,不是明星的人可能認識也可能不認識。你每次只可以問一個人是否認識另一個人這樣的問題,問最少問多少次可以找出明星?
明星不認識所有其他人,但所有人都認識明顯,所以可以這樣:
從N個人中找兩個人a b,問a是否認識b,若a認識b則a肯定不是明星排除a,若a不認識b,則b肯定不是明星(用反證法)。
因此問一個問題我們便可以排除掉一個人(即若a認識b,則a不是明星;若a不認識b,則b不是明星),最多經過n-1次便可以找到明星。
昨天晚上又遇到一個類似的題目,一個圖,有一個點,是所有的點都指向這個點,而這個點不指向任何一個點,稱之為匯點,求匯點。
遍歷邊,對一條邊去掉發出邊的那點,最后就剩下匯點
1、兩個有序鏈表的合并。看過這個題,考慮下邊界問題,可以用O(n)時間,O(1)空間解
決。寫完后,說我代碼有個小bug,然后討論后改之。問這個算法在哪種條件下不work,
想了許久,突然靈光一現,想出可能鏈表有環或者兩個鏈表有可能有公共節點。他很開
心,說很久沒有人能同時想出兩個case了。
?
2、字符串A和字符串B。是否B包含了A所有的字符串,要考慮字符的個數問題,比如A:
aabb , B: abccc,就不滿足條件了。這個題目跟google當年的筆試題很像,開一個256的
int[]數組做hashtable,很容易解決了。由于之前沒有考慮上述的情況,他指出來了,
稍微改下,就過了
?
3、一個n*n迷宮,方塊里可能是墻,可能是路,問怎么走出出口,求最短路徑。先說思
路,然后寫偽代碼。很簡單的寬度優先,每個方格里記錄走的步數和來自于哪個方塊。
很快就解決了。
?
1)N個數,選出任意兩個數求和,問所有這些可能性的和是多少。我說最簡單的方法是
模擬,O(N^2),然后問有沒有更簡單的,想了想,計算了下所有數出現的個數是 (N-1
)/2,所以很簡單,就是?? sum*(N-1)/2,時間復雜度是O(N)
?
2)問試卷最后一個題。之前聽同學說過,我自己想過。A B兩個有序數組,A中選一個,
B中選一個,要求和為某個指定值m,問怎么選。感覺是《編程之美》上一維數組中求兩
個數和的變形,所以只要變換一下:A中的數從頭往尾走,B中數從尾往前走就好;但是
這么會遺漏,如果沒找到,用相同的方式,A中的數從尾往頭走,B中的數從頭往尾走,
看能否找到
?
3)問知道怎么確定有環鏈表。說知道。然后問,怎么確定環的起點節點。然后說沒見過
。他說,浙大的很奇怪,第一個問題都會,而第二個問題都不會。然后我開始想,最簡
單的用hash表保存已遍歷的節點。然后他說需要常數空間。想了很久大概15分鐘不會,
讓他提示下。說如果兩個鏈表有公共節點,問怎么去找這個公共節點,想了幾分鐘,想
出來了。只要都遍歷一下得到長度的信息,利用這個信息再遍歷一次,就可以找到公共
節點。
然后想到第有環的只是一個變種,只要把環斷開。就成了第一個問題。然后叫我寫代碼
,很順利的寫完。
?
4)已知兩個矩形的四個節點信息,然后給一個API——可以得到某個點在是否在某矩形
內,問怎么判斷矩形相交。答曰,矩形相交不需要這么復雜,只要判斷線段相交就行。
可能他之前沒想到我會這么回答,仔細解釋了下,他說可行。然后問有沒有特殊情況,
我說有,一個矩形在另一個矩形內,可能線段不相交,矩形也相交了。然后答曰,這個
只要判斷小矩陣的幾點是否在大矩陣內就可以了
?
5)問一個n*n的方塊內,有一條環形路徑。路徑上的點都是1,其他點都是0.。給路徑中
的任意一個點,問這個路徑所包含的面積。想了一分鐘,覺得粉兩步走:1)深度優先找
路徑 2)寬度優先算面積 然后解釋了下,說可行
心思縝密,反應快
這題可以用掃描線方法
http://blog.csdn.net/lyso1/article/details/5885582總結