我有一系列请求,并要求计算系列的累计ttl并给出这些请求。
let requests = [
{requestId: 't2', startedAt: 1489744808, ttl: 8},
{requestId: 't3', startedAt: 1489744803, ttl: 3},
{requestId: 't1', startedAt: 1489744806, ttl: 12},
{requestId: 't4', startedAt: 1489744810, ttl: 1}
]
要解决这个问题的算法是什么,因为我知道答案最终应该是15。
我认为最早的请求1489744803
应该具有最大的ttl,但事实并非如此,而1489744806
请求具有最大的请求,那么为什么会这样?
谢谢:D
答案 0 :(得分:1)
let minStart = requests.reduce((v, obj) => Math.min(v, obj.startedAt), Number.MAX_SAFE_INTEGER)
let result = requests.reduce((r, obj) => Math.max(r, obj.startedAt - minStart + obj.ttl), 0)
或
let minMax = requests.reduce((o, obj) => { return { min: Math.min(o.min, obj.startedAt), max: Math.max(o.max, obj.startedAt + obj.ttl)}}, { min: Number.MAX_SAFE_INTEGER, max: 0 })
console.log(minMax.max - minMax.min)
(解决方案2看起来有点难看,但只需要在数组上循环一次。)
答案 1 :(得分:1)
您可以通过以下方式解决:
let requests = [
{requestId: 'poiax', startedAt: 1489744808, ttl: 8},
{requestId: 'kdfhd', startedAt: 1489744803, ttl: 3},
{requestId: 'uqwyet', startedAt: 1489744806, ttl: 12},
{requestId: 'qewaz', startedAt: 1489744810, ttl: 1}
]
let cumulativeTtl = 15
Ans:
var max = result = 0;
var min = requests[0].startedAt;
requests.forEach(function(row){
max = ((row.startedAt + row.ttl) > max) ? (row.startedAt + row.ttl) : max;
min = (row.startedAt < min) ? row.startedAt : min;
});
result = (max - min);
console.log((result == cumulativeTtl) ? true : false);
答案 2 :(得分:0)
首先我们需要使用startedAt和ttl找到每个请求的最小值和最大值,一旦你得到最终结果,最大值然后我们需要减去max - min,最后我们得到解决方案。
function cumulativeTtl(requests){
var min = requests[0].startedAt, max = 0;
for(var i in requests){
min = (requests[i].startedAt < min)?requests[i].startedAt:min;
max = ((requests[i].startedAt + requests[i].ttl) > max)?(requests[i].startedAt + requests[i].ttl):max;
}
return max - min;
};
<强>解释强>
when i = 0;
min = 1489744808 // (1489744808 < 1489744808)?1489744808:1489744808;
max = 1489744816 // ((1489744808 + 8) > 0)?(1489744808 + 8):0;
when i = 1;
min = 1489744803 // (1489744803 < 1489744808)?1489744803:1489744808;
max = 1489744816 // ((1489744803 + 3) > 1489744816)?(1489744803 + 3):1489744816;
when i = 2;
min = 1489744803 // (1489744806 < 1489744803)?1489744806:1489744803;
max = 1489744818 // ((1489744806 + 12) > 1489744816)?(1489744806 + 12):1489744816;
when i = 3;
min = 1489744803 // (1489744810 < 1489744803)?1489744810:1489744803;
max = 1489744818 // ((1489744810 + 1) > 1489744818)?(1489744810 + 1):1489744818;
最后max-min然后我们得到解决方案,就是这样。
max-min = 15 // 1489744818 - 1489744803