难度:简单
题目:有 n
个人前来排队买票,其中第 0
人站在队伍 最前方 ,第 (n - 1)
人站在队伍 最后方 。
给你一个下标从 0 开始的整数数组 tickets
,数组长度为 n
,其中第 i
人想要购买的票数为 tickets[i]
。
每个人买票都需要用掉 恰好 1 秒 。一个人 一次只能买一张票 ,如果需要购买更多票,他必须走到 队尾 重新排队(瞬间 发生,不计时间)。如果一个人没有剩下需要买的票,那他将会 离开 队伍。
返回位于位置 k
(下标从 0 开始)的人完成买票需要的时间(以秒为单位)。
解决过程:
先计算第一次买到票的时间,此时排在末尾,这时每买一次票都需要等所有人买完,需要扣除已经买完所需票数的人。
class Solution:
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
if tickets[k] == 0:
return 0
p = len(tickets)
n = k + 1
tickets = [x - 1 for x in tickets[:k+1]] + tickets[k+1:]
while True:
if tickets[k] == 0:
break
s = tickets.count(0)
n = n + p - s
tickets = [x - 1 for x in tickets]
return n
测试用例[5, 1, 1, 1]出现问题,问题出在第14行,没有在所需票数为0时限制条件,所需票数不需要再减去1。
class Solution:
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
if tickets[k] == 0:
return 0
p = len(tickets)
n = k + 1
tickets = [x - 1 for x in tickets[:k+1]] + tickets[k+1:]
while True:
if tickets[k] == 0:
break
s = tickets.count(0)
n = n + p - s
tickets = [x - 1 if x > 0 else x for x in tickets]
return n
结果:
总结:
1.列表推导式的使用:简化了代码的逻辑。
2. 循环与退出条件的把握:在本题中,使用 `for` 循环能减少判断。
3. 有效性检查:在执行减法操作之前,注意检查,避免出现不符合实际的情况。