小明數學不太好,如果他計算a+b需要花費(a+b)的時間,現在有n個數字,讓小明去求這n個數字的和,求小明計算這n個數字所花費的最小時間;
備注:每次都要先算最小的兩個數的和,這樣總時間才會最小。
輸入:[1,2,3]
輸出:9
說明:
1+2需要3秒
3+3需要6秒
總共需要9秒
輸入:[1,2,3,4,5]
輸出:33
說明:
1+2需要3秒
3+3需要6秒
4+5需要9秒
6+9需要15秒
uj5u.com熱心網友回復:
這是要做什么?寫著玩嗎?
function sum_time(arr: number[], sum: number): number {
console.log('源資料:'+arr.join(','));
//先排序
arr.sort((a, b) => a - b);
//最小兩項求和
const _sum = arr[0] + arr[1];
//累加
sum += _sum;
//流程列印
console.log(arr[0] + ' + ' + arr[1] + ' = ' + (arr[0] + arr[1]));
console.log('計算耗時:' + sum);
console.log('==================================');
//最新需要計算的陣列
arr = [_sum].concat(arr.slice(2));
//遞回
arr.length == 1 && console.log('結束::最終耗時:' + sum);
return arr.length == 1 ? sum : sum_time(arr, sum)
}
const arr = [1, 2, 3, 4, 5, 6,7];
console.log('開始計算:\n==================================');
sum_time(arr, 0);
uj5u.com熱心網友回復:
不列印流程的話,其實最少可以只有4行代碼……
function sum_time(arr: number[], sum: number): number {
//先排序
arr.sort((a, b) => a - b);
//最小兩項求和
const _sum = arr[0] + arr[1];
//累加
sum += _sum;
//最新需要計算的陣列
arr = [_sum].concat(arr.slice(2));
//遞回
return arr.length == 1 ? sum : sum_time(arr, sum)
}
uj5u.com熱心網友回復:
arr不可知的話,加個長度判斷才完整
function sum_time2(arr: number[], sum: number = 0): number {
if(arr.length < 3) {
return (arr && (arr[0] || 0) + (arr[1] || 0)) || 0;
};
//先排序
arr.sort((a, b) => a - b);
//最小兩項求和
const _sum = arr[0] + arr[1];
//累加
sum += _sum;
//最新需要計算的陣列
arr = [_sum].concat(arr.slice(2));
//遞回
return arr.length == 1 ? sum : sum_time2(arr, sum)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/200592.html
標籤:JavaScript
