描述题目
有 n 个人前来排队买票,其中第 0 人站在队伍 最前方 ,第 (n - 1) 人站在队伍 最后方 。
给你一个下标从 0 开始的整数数组 tickets ,数组长度为 n ,其中第 i 人想要购买的票数为 tickets[i] 。
每个人买票都需要用掉 恰好 1 秒 。一个人 一次只能买一张票 ,如果需要购买更多票,他必须走到 队尾 重新排队(瞬间 发生,不计时间)。如果一个人没有剩下需要买的票,那他将会 离开 队伍。
返回位于位置 k(下标从 0 开始)的人完成买票需要的时间(以秒为单位)
n == tickets.length
1 <= n <= 100
1 <= tickets[i] <= 100
0 <= k < n
解题思路:
1、假设数组tickets[3]={2,3,4},返回下标k=1所用的时间,观察每趟数组的变化:
第一趟:{1,2,3},累计用时1+1+1=3秒
第二趟:{0,1,2},累计用时3+1+1+1=6秒
第三趟:{0,0,2};累计用时6+0+1=7秒
所以位置 k=1的人完成买票需要的时间为7秒。
2、通过观察发现,k位置前每位购票者实际占用的时间均小于等于 tickets[k],k位置后每位购票者实际占用的时间均小于 tickets[k]。
3、 tickets[k]==0为退出循环的标记。
代码展示:
#include <stdio.h>
int timeRequiredToBuy(int* tickets, int ticketsSize, int k){
int time=0;
while(tickets[k]>0){
for(int j=0;j<ticketsSize;j++){
if(tickets[j]>0){
tickets[j]--;
time++;
}
if(tickets[k]==0)
break;
}
}
return time;
}
int main(void){
int a[4]={5,1,1,1};
printf("%d",timeRequiredToBuy(a,4,0));
return 0;
}
示例运行结果:
8