Java工程師面試 面試演算法題(一)

2021-08-10 05:11:21 字數 3778 閱讀 5916

##一、階乘問題:

階乘結果 從個位到倒數 連續為零的個數:

首先想到零是怎麼出現的10的倍數相乘即可,即 (5*2)*n n為任意的數。

1、2 只要是偶數 都包含2.而包括5的只存在位數為0或者5的數裡面

2、所有2的個數 遠遠多於5的個數,故只要統計五的個數

3、每加乙個五,數字就多乙個5,減少乘法運算。

需要消耗o(1)的空間和o(n/5)的時間

public void countzero(int n)

public int sum2(int k)

public int sum3(int k, int m)

return k[m] + sum3(k, m + 1);

}

##三、交錯合併陣列

編寫乙個交錯合併列表元素的函式。例如:給定的兩個列表為[a,b,c]和[1,2,3],函式返回[a,1,b,2,c,3]。

有點類似於歸併排序,合併兩個陣列。這裡面使用交錯排序。

第一步:按照最短的數 完成2*min(length)長度,

第二步:再將剩餘的數copy進餘下的空間

(第二步 在陣列相等長度的時候 忽略)

public int merge(int arr1, int arr2)
算到第94個的時候,資料越界了。沒辦法8個位元組的long都不夠用。該方法走不通。

第91個值是: 4660046610375530309

第92個值是: 7540113804746346429

第93個值是: -6246583658587674878

第94個值是: 1293530146158671551

####4.2.2、使用bigdecimal方法計算:

public string f() 

public string add(string a, string b)

結果是:

花費時間 7ms

第90個值是: 618970019642690137449562112

第91個值是: 1237940039285380274899124224

第92個值是: 2475880078570760549798248448

第93個值是: 4951760157141521099596496896

第94個值是: 9903520314283042199192993792

第95個值是: 19807040628566084398385987584

第96個值是: 39614081257132168796771975168

第97個值是: 79228162514264337593543950336

第98個值是: 158456325028528675187087900672

第99個值是: 316912650057057350374175801344

####4.2.3使用biginteger

public biginteger f2()
時間是3ms

###4.2 擴充套件–計算第幾位的斐波拉契數

####1、暴力演算法,使用上面的演算法,列印第幾次的結果

時間複雜度是 o(n),空間複雜度是o(1)

####2、 簡化演算法:

前幾位斐波拉契數:0 1 1 2 3 5 8…

當n大於2的時候,第n位數等於第n-1位+第n-2位之和。

第一種思路:使用遞迴演算法 計算出

時間複雜度是o(n),空間複雜度時o(2*n)

function a(n)
####第二種演算法:

(1 ,0) *()=(3,1)

(3 ,1) *()=(5, 3) (1 ,0) ()()=(5, 3)

…以此類推,只要計算出()裡面的數,就可以用公式一步計算出最終的結果。

很容易的使用行列式(不會的可以看看線性代數 )就計算出()={{1,1},{1,0}}

劃分計算模組

n<3直接得出結果

n>2

1、行列式冪次方的計算方法

2、冪次方的結果乘以(1,0)即可得到(f[n],f[n-1]) (n>2)

##五、組建最大的數

編寫乙個能將給定非負整數列表中的數字排列成最大數字的函式。例如,給定[50,2,1,9],最大數字為95021。

此處最大突破點就是比較兩個數 順序 導致結果變化,(前+後 ).compareto(後+前)

public void co(string a)

}} stringbuffer sb=new stringbuffer();

for(int i=0;i##六、算出指定的數

編寫乙個在1,2,…,9(順序不能變)數字之間插入+或-或什麼都不插入,使得計算結果總是100的程式,並輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。

###1、暴力演算法,窮舉

/*** 採取窮舉的方法,測試是否符合條件

*/@test

public void aa() ;

byte b = new byte[8];

string res = "";

for (int i = 0; i < 6561; i++)

addby3(b);

} }/**

* * @param b

* 數字字符集

* @param c

* 數字之間的操作可能

* @return 等於100的操作的四則運算

*/public string getres(byte b, byte c) else if (b[j] == 1) else if (b[j] == 2)

} // 記錄本次操作的情況

stringbuilder sb = new stringbuilder();

// 因為最大結果是9位數 超出int

biginteger sum = new biginteger(list.get(0));

// 計算

for (int j = 0; j < opeator.size(); j++) else if (opeator.get(j).equals("-")) else

} string s = sum.tostring();

if ("100".equals(s))

return sb.tostring();

else

return null;

} /**

* 三進製加法,滿2 清零 進一;最長為8位數

* * @param c

*/public void addby3(byte c) else

} }

123+45-67+8-9

123+4-5+67-89

123-45-67+89

123-4-5-6-7+8-9

12+3+4+5-6-7+89

12+3-4+5+67+8+9

12-3-4+5-6+7+89

1+23-4+56+7+8+9

1+23-4+5+6+78-9

1+2+34-5+67-8+9

1+2+3-4+5+6+78+9

運算時間43 毫秒

演算法工程師面試準備

貝葉斯 nb 神經網路 svm 概率圖模型 特徵選擇 其他 梯度下降的優缺點 降取樣,pca,lda pca的基於特徵值壓縮的方法 基於isolation forest識別的方法 梯度下降的優缺點 常見損失函式 bagging 和 boosting的區別 為什麼用最小二乘而不是最小四乘 gb和牛頓法...

面試總結 Java高階工程師(一)

不知道是不是職位原因還是沒遇到,面試時,都不需要做筆試題,而是填張個人資訊 或者直接面試 1 spring 事務的隔離性,並說說每個隔離性的區別 解答 spring事務詳解 2 spring事務的傳播行為,並說說每個傳播行為的區別 解答 spring事務詳解 3 hibernate跟mybatis ...

面試總結 Java高階工程師(一)

不知道是不是職位原因還是沒遇到,面試時,都不需要做筆試題,而是填張個人資訊 或者直接面試 1 spring 事務的隔離性,並說說每個隔離性的區別 解答 spring事務詳解 2 spring事務的傳播行為,並說說每個傳播行為的區別 解答 spring事務詳解 3 hibernate跟mybatis ...