前幾天回家姐夫給我出了三道面試題(新手難度);
題目
1.給定乙個有序數列,求value在第一次出現的位置(資料重複度比較高)
第一反應就是二分查詢,然後再往前找一段。(被姐夫pass掉了,要我再優化一下);
題目不難,二分思想沒錯,在此基礎上我進一步二分,就行了(感覺自己演算法題白寫了,這都要想這麼久);
int
fun(vector<
int> arr,
int n)
}return last;
}
2.給定乙個無序數列,求第k大的數值
我的第一反應是用堆排序然後直接pop()k次就行了;(空間浪費時間浪費!!!)
int
quicksort
(vector<
int> arr,
int k,
int left,
int right)
swap
(&arr[i]
,&arr[left]);
if(ireturn
quicksort
(arr,k,i+
1,right)
;else
if(i>k)
return
quicksort
(arr,k,left,i-1)
;else
return arr[k]
;}
分析一下時間和空間複雜度;
第一種情況: 時間o(nlogn),空間o(n);
第二種情況: 時間o(nlogk),空間o(k);
第三種情況: 時間o(n),空間 o(n);
3.飛機加油問題:現有一架飛機要繞地球飛一圈,但是單次再油只夠其飛行1/4圈,問最少需要多少輛飛機同時同地起飛才能使一架飛機飛完一圈(假設飛機在飛行途中可以自由換油且無損耗)
當時想了挺久的,後來有了一點思路,2架飛機同時起飛可以讓1架飛機飛到1/8點處(其中一架滿油,另一架墜毀了);由此類推4架生2架,2架再前進1/8犧牲一架,由此答案是2^6架飛機就可以;
以上思路是有問題的,這樣不能保證所用的飛機最少,想一想也知道為什麼,其中很多油量的浪費;
其實自習想想也挺簡單的,只要保證油量浪費最少就行了,保證1架飛機供油,其他飛機一直處於滿油狀態,然後在3/4處有1架滿油的飛機就行了;
設有n架飛機同時起飛,第1架飛機墜落點在m處,則mn=1/4,m=1/4n;第2架飛機墜落點就在1/4(n-1)+1/4n……最後倒數第二架飛機墜落點在1/2+……+1/4*(n-1)+1/4n,這個值又要等於3/4;
**實現就很簡單了,最後求得是31架;
總結:這麼簡單的題都不會寫,寫題只會套模板,以後多練練思維,最後感謝姐夫,orz;
面試演算法題
前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...
面試演算法題
1 直方圖矩形最大值 class solution s.push i return res 2 第n個醜數 class solution return res.back 3 lru cache 最近最少使用頁面置換快取器 class lrucache int get int key void set...
某個面試演算法題
援引某人部落格 有乙個整數n,寫乙個函式f n 返回0到n之間出現的 1 的個數。比如f 13 6,現在f 1 1,問下乙個最大的f n n的n是什麼?writed by chszs public void fn int inputval 1000000 int cntforone 0 long c...