最近面試的時候,總會碰到一道題,剛開始看到題目一臉懵,後來第二次又碰到,好吧,既然躲不過,那我們就坐下來好好理理,先弄明白原理,再去寫程式碼.
需求:請用js求出[3, -6, 123, -945, -231, 112]中的最大子序列?
一 . 什麼叫最大子序列?看的一臉懵逼
例如:[1,-1,2]這個陣列,它的子序列,就是[1],[1,-1][1,-1,2],[-1,2],[2] ('為了看的清晰,小編在這裡用[]包起來'); 看到這裡想必大家都已經明白了子序列的概念,就是不同的組合,最大的子序列就是子序列之和最大的那個排列.
二 . 弄懂了題目,我們現在就著手開始分析原理:
- 要找出左右的排序組合
- 算出所有的排序組合之和,找到和最大的那項排序.
三 .上程式碼
var ary=[3, -6, 123, -945, -231, 112];
//第一步:求出所有的子序列組合;[[3],[3,-6]....]
var allary=[];//所有的子序列-------------------------
for(var i=0;i<ary.length;i++){
let cur=ary[i];
allary.push([ary[i]]);
for(var j=i+1;j<ary.length;j++){
let item=ary.slice(i,j+1);
allary.push(item);
}
}
//第二步驟:累加求和,求出最大的和
let maxsum=null;
let totalAry=[];//求出所有子序列的和
let index=null;//代表maxsum 在totalAry中對應的索引,也就是子序列中對應和最大的那項子序列
for (var i=0;i<allary.length;i++){
let total=allary[i].reduce((pre,cur)=>{
return pre+cur;
});
totalAry.push(total);
maxsum=maxsum>total?maxsum:total;
//第三步驟:找出 maxsum 在totalAry 中的索引
index= totalAry.findIndex((item)=>{
return item==maxsum
})
}
console.log(allary[index])
複製程式碼
大致的原理就是這樣,在這裡小編就不封裝了,做程式設計師的你just so so,這個程式碼通俗易懂,但是缺少優化,歡迎大家一起來做更深層次版本的答案,讓我們一起提升,讓我們們的程式之路just so so!