這是昨天面試時碰到的一道演算法題:任意數分三組,使得每組的和盡量相等(感謝博友提供的關於該問題的相關資料 劃分問題)。由於時間倉促,加之面試時頭昏腦漲,這道題沒做出來甚至沒有給出思路,這讓我多少有些遺憾和不甘。因為最近接觸演算法的東西較多而且本身對演算法感興趣,所以回家之後絞盡腦汁想把這題做出來。其實剛看到這題時感覺不難,但是因為數字個數及數值的不確定,我感覺這題越想越難。昨天一晚上沒有睡好,甚至做夢都在想這題!
今天上午在多個群裡問了這題,都沒有給出思路,真是絕望至極。很多人都說 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]]
//view code任意數分三組,每組和盡量相等(也就是最大值與最小值差值最小)
function
equal(arr)
while (array.length > 3)
return
array;
}
為了按要求輸出陣列,我還使用了多維陣列排序及陣列內元素求和的演算法,我在此沒有深究,只是普通的氣泡排序,如下:
//計算陣列元素和
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,二進位制表示中...