一道看似非常難的面試演算法題

2022-03-07 16:50:44 字數 2233 閱讀 2646

這是昨天面試時碰到的一道演算法題:任意數分三組,使得每組的和盡量相等(感謝博友提供的關於該問題的相關資料 劃分問題)。由於時間倉促,加之面試時頭昏腦漲,這道題沒做出來甚至沒有給出思路,這讓我多少有些遺憾和不甘。因為最近接觸演算法的東西較多而且本身對演算法感興趣,所以回家之後絞盡腦汁想把這題做出來。其實剛看到這題時感覺不難,但是因為數字個數及數值的不確定,我感覺這題越想越難。昨天一晚上沒有睡好,甚至做夢都在想這題!

今天上午在多個群裡問了這題,都沒有給出思路,真是絕望至極。很多人都說 n/3 的思路,其實這種思路一開始就是死胡同。本人屬於那種不會輕言放棄之人,哈哈。本人多年經驗得出一結論:只要認真思考,有耐心,很多問題都能迎刃而解。每次遇到難纏的問題,我都會抓耳撓腮,而一旦解決,又會手舞足蹈。跑遠了,言歸正傳,中午正準備趴在工位上休息,眼睛掃了掃筆記本,瞬間茅塞頓開。真是踏破鐵鞋無覓處,得來全不費工夫!果不其然,演算法就是窗戶紙!

[3, 8, 20, 15, 60, 1, 32];

////

1.從大到小排序

[60, 32, 20, 15, 8, 3, 1]

//2.剩餘數疊加

[60, 32, 35(20+15), 8, 3, 1]

//3.重排序

[60, 35, 32, 8, 3, 1]

//4.再疊加

[60, 35, 40(32+8), 3, 1]

//5.重排序

[60, 40, 35, 3, 1]

//6.再疊加

[60, 40, 38(35+3), 1]

//7.結果

[60, 40, 39]

我想看完上述流程演示,這個題基本就沒問題了吧。上述流程最終輸出的是每組的和,並沒有反映出每組的分組情況。我們應該定義乙個函式,輸出帶有分組情況的陣列。比如:

var arr = [3, 8, 20, 15, 60, 1, 32];

function

equal(arr)

>input equal(arr)

< output [[60],[32,8],[20,15,8,3,1]]

以下是我寫的演算法,其實從有思路到寫出程式也廢了很大勁:

//

任意數分三組,每組和盡量相等(也就是最大值與最小值差值最小)

function

equal(arr)

while (array.length > 3)

return

array;

}

view code

為了按要求輸出陣列,我還使用了多維陣列排序及陣列內元素求和的演算法,我在此沒有深究,只是普通的氣泡排序,如下:

//

計算陣列元素和

function

sum(o) );

} else

return

sum;

}//多維陣列排序

看著輸出的結果,確實有點小激動~

最後,我們可以將此題再延伸一下,比如任意數分任意組,有了上面的演算法,這個就很簡單了,直接貼**

//

計算陣列元素和

function

sum(o) );

} else

return

sum;

}//多維陣列排序

function

sortmarray(arr) }}

return

arr;

}//任意數分 n 組,每組和盡量相等(也就是最大值與最小值差值最小)

function

equal(arr,n)

while (array.length >n)

return

array;

}//測試陣列

var arr = [3, 8, 20, 15, 60, 1, 32];

最後的最後還要說一句,也算是自我檢討以及對**的孜孜以求,雖然功能完成了,但從程式設計師的角度來看,我還沒有對輸入引數進行校驗,所以這樣的**還是有瑕疵的!

一道看似簡單的面試題

使用php,給定乙個數,判斷這個數是否是二的n次方這樣看似簡單的乙個面試題,實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答這道題。先亮出答案 function exponentiation number if number number 1 0 else exponentiation...

一道看似簡單的面試題

使用php,給定乙個數,判斷這個數是否是二的n次方 這樣看似簡單的乙個面試題,實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答這道題。先亮出答案 function exponentiation number if number number 1 0 else exponentiatio...

面試遇到的一道演算法題

今天面試摩拜單車遇到一道演算法題,題目如下 給定乙個正整數範圍 m,n 返回乙個陣列,該陣列是每個正整數轉換為相應二進位制之後包含1的個數 示例 給定 1,5 1的二進位制位1,二進位制表示中包含位1的個數字1,2的二進位制位10,二進位制表示中包含位1的個數字1,3的二進位制為11,二進位制表示中...