使用nodeJS时如何优化购买演出门票的算法

时间:2018-04-07 21:13:13

标签: javascript algorithm performance

我正在某个门户网站上进行测试,问题如下:

  

已经成立了一条线来购买音乐会门票。为了延迟经纪人购买大量门票造成的短缺,场地管理层决定一次只卖一张门票。如果买家想购买更多门票,他们必须再次排队等候。杰西站在队中并有许多门票可以购买。

     

根据门票买家列表及其所需门票数量,确定Jesse购买门票需要多长时间。将陈述Jesse的排名,每笔交易需要1个单位时间。为了您的目的,没有时间花在移动到后面。

     

例如,如果票证要求的零索引数组,票证= [1,2,5]和Jesse的位置p = 1,则票证销售的前五秒看起来像这样:

img

功能描述

在下面的编辑器中完成waitTime函数。该函数必须返回一个整数,表示Jesse购买所需票数的时间单位。

waitingTime具有以下参数:

tickets[tickets[0],...tickets[n-1]]:  an array of tickets desired by each person at position tickets[i]

p: Jesse's position in line

约束

  • 1< = n< = 10 5
  • 1&lt; = ticket [i]&lt; = 10 9 ,其中0 <= i <1。 Ñ
  • 0&lt; = p&lt; Ñ

示例输入0

5 2 6 3 4 五 2

示例输出0

12

购买2张门票共花了12个单位。

我的解决方案如下:

function waitingTime(tickets, p) {
    var totalTime = 0,
        l = tickets.length,
        frontPersonStatus;
    while(true) {
        if(p === 0 && tickets[0] === 1 &&  ++totalTime) break;
        frontPersonStatus = tickets.shift() - 1;
        frontPersonStatus !== 0 ? (tickets[tickets.length] = frontPersonStatus) : l -= 1;
        totalTime++;
        p = p === 0 ? l - 1 : p - 1;
    }
    return totalTime;
}

但它运行了一些测试用例后,所有其他测试用例都失败并说因超时而终止 .b所以我认为必须有一些更优化的解决方案然后这个< / em>的

test

1 个答案:

答案 0 :(得分:2)

站在杰西面前的每个人都必须支付相同数量的门票或更少的门票,在杰西买下所有门票之前,身后的每个人都要支付一个或多个门票:

  let totalTime = 0;
  for(const [pos, ticket] of tickets.entries())
    totalTime += Math.min(ticket, tickets[p] - (pos > p));