一. 海量資料求中位數,比如10g的int64的數,求排序後最中間的數
首先,若能全部放入記憶體中,那麼可以使用類似快排的演算法,每次保留包含中位數的那段資料,直到找到中位數;那麼海量資料顯然無法一次性放入記憶體,如何每次減少資料呢?乙個自然的思路就是分成若干段(大小能放入記憶體中),也使用之前的演算法,但是該捨棄哪一段顯然要在整體上來判斷;我的思路是引入乙個基準數x,所有的段都使用x進行partition,那麼就能知道全部資料中小於x的和大於x的資料量,也即知道了該保留哪些資料;重複該過程,當資料量能讀到記憶體時就ok了。
二. 乙個亂序陣列求兩兩之差絕對值最小的值
最簡單的演算法就是排序然後相鄰的數做差記錄絕對值最小的,可以接受;
更巧妙的方法還是利用快排,與基準數x比較時就記錄下最小的差絕對值,分成兩半後,兩段只需要在各自的段求最小值,不會跨過x,最後比較下每次產生的最小值即可。
三. 字串替換演算法
給定乙個字串 str ,要求將其中的『m』全都替換成『abc』,如何盡量優化空間和時間複雜度?
如果每次只考慮其中乙個『m』並進行替換移位,顯然移位操作代價太大;很容易的想到要從全域性出發,使得移位能夠一步到位。
具體就是首先遍歷求出『m』的個數,計算出所需的額外空間,然後從後往前進行移位和替換。
四.給你乙個陣列 a [ 1 .. n ] ,請你在 o ( n ) 的時間裡構造乙個新的陣列 b [ 1 .. n ] ,使得 b [ i ] = a [ 1 ] * a [ 2 ] * ... * a [ n ]/a [ i ] 。你不能使用除法運算。
比較容易的想到記錄中間結果,任意乙個 b[i] 都可以看成是兩個序列的成績,乙個是a[1..i-1],另乙個是a[i+1..n],因此可以先求出 a[1..k],k=1..n-1;以及 a[k..n],k=2..n-1 ;分別消耗o(n)的時間,最後組合起來就構造出b,同樣花費o(n)。總時間也是o(n)
幾道演算法題
1 n階乘之和 public class test1 sum kk system.out.println sum 2.獲取二維陣列每列最小的值 public class test2 system.out.println sum public long jiecheng int x return su...
記幾道前端演算法題目
未完待續。演算法題一 js編碼實現乙個render方法,使得可以這樣呼叫 const year 2017 const month 09 const day 21 const str render console.log str 輸出2017 09 21可以看到是模板字串。使用eval將字串轉換成模板...
演算法題記錄
1.給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。法一 時間複雜度o n 2 空間複雜度o n var twosum function nums,targ...