计算一系列请求的累计ttl(生存时间)

时间:2017-06-06 09:22:15

标签: javascript

我有一系列请求,并要求计算系列的累计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

3 个答案:

答案 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