遇到的幾個演算法題

2021-06-28 09:30:38 字數 1630 閱讀 2930

1、如何快速求得與某個數平方根最接近的整數

數學上平方根一般由級數展開求得。但是此處只求其近似整數,用二分查詢法,複雜度為log(n)。

2、有乙個幾個t的大檔案,記錄了若干**記錄,需要累加計算總價,如何算。現在計算機記憶體有限。

3、有若干個大檔案,裡面儲存了各個url的訪問記錄,順序是亂的,要求將各個url 訪問的記錄數量彙總。計算機記憶體很小。

將檔案的記錄重新按照url的hashcode範圍重新寫入到若干個檔案中,若是其中某個檔案依舊太大,再將該檔案拆分。這樣相同url只會在同乙個檔案中。

4、有乙個數列0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,......, 給出數列下標,求出該下標對應元素

注意,這是fibonacci數列,其通項為:a(n)=a(n-1)+a(n-2) .用乙個迴圈就可以求出,不要用遞迴,遞迴會重複計算。

for(int i=2; i<=n;i++ )

5、給定一串整數,找出其中和最大的連續子數列,包括子數列的位置和最大和。

線性演算法:

這個演算法是基於兩個結論得來的:

(1)、如果數列a的某個子列a(i, j) 的和s(i, j) < 0, i< js(i, q) = s(i, j) + s(j+1, q) < 0 + s(j+1, q) = s(j+1, q)

這個結論說明,從位置 i 開始的子列,一旦遇到和為0的子列,後面可以不搜尋了,直接從 j+1 開始重新計算。

(2)、如果a(i, j) 是數列a以 i 起始的子列中第乙個和s(i, j) < 0 的,則對任意 i <= p <= j, p<= q,a(p, q) 的和 s(p, q) 要麼小於最大連續子列和,要麼與現存的最大連續子列和相等。所以a(p, q)序列可以跳過。

因為s(i ,j) 是第乙個<0 的,所以s(i, p-1)必然》=0,則 s(p, q) = s(i, q) - s(i, p-1) <= s(i, q)

- 當 q > j 時,由結論1得知, s(i, q) < s(j+1, q),則 s(p, q) < s(j+1, q)

- 當q <= j 時,(這個暫時不會證明。。。)

//o(n)

void maxsubset_2(int nums, int length)

if (sum < 0)

}cout << "max: " << maxsum << " ( " << maxstart << ", " << maxend << " )" << endl;

}

6、有100步樓梯,每次走1步或兩步 問有多少走法

上到第n級共有a(n)種方法

那麼:a(1)=1,a(2)=2,a(3)= a(2)+1=3,a(4)=a(3)+ a(2) .....

上到第n級有兩種情形

①從第n-1級上1步

②從第n-2級上2步(不能上1步,否則與第一種情形重複)

a(n)=a(n-1) + a(n-2)  ...

又是乙個 fibonacci數列

遇到的幾個演算法題

1 如何快速求得與某個數平方根最接近的整數 數學上平方根一般由級數展開求得。但是此處只求其近似整數,用二分查詢法,複雜度為log n 2 有乙個幾個t的大檔案,記錄了若干 記錄,需要累加計算總價,如何算。現在計算機記憶體有限。3 有若干個大檔案,裡面儲存了各個url的訪問記錄,順序是亂的,要求將各個...

幾個PHP演算法題

有5個人偷了一堆蘋果,準備在第二天分贓。晚上,有一人遛出來,把所有菜果分成5份,但是多了乙個,順手把這個扔給樹上的猴了,自己先拿1 5藏了。沒想到其他四人也都是這麼想的,都如第乙個人一樣分成5份把多的那乙個扔給了猴,偷走了1 5。第二天,大家分贓,也是分成5份多乙個扔給猴了。最後一人分了乙份。問 共...

面試遇到的演算法題1

1.兩個整數求和 string a 893333.3333 string b 349.999 求 a b 由於數字太長,只能存在string 裡,不能整體轉成int long來加,只能一位一位的轉成int來加,注意進製。用乙個for迴圈按每一位做加法,最後輸出到乙個string裡。如何將char型別...