【CPX】秒杀服务

题目:实现一个简易的秒杀服务,有3个接口:                                                    【2017拼多多笔试】

1. 添加一个秒杀活动 addActivity(int startTime, int endTime, int goodsId, int limitQuantity)

1
2
3
4
5
6
7
8
9
10
参数说明:
 
     * 时间区间为左闭右开:[startTime, endTime) 。数据保证 startTime < endTime,startTime 大于当前时间戳
     * goodsId 一定为存在的商品id。每个goodsId至多添加一次秒杀活动。
     * limitQuantity > 0
 
返回值有以下两种情况:
 
     * 添加成功,返回秒杀活动ID (从 0 开始自增)
     * 秒杀商品数量大于商品库存,添加失败,返回- 1

2. 购买秒杀商品 buyGoods(int activityId, int quantity)

1
2
3
4
5
6
7
8
9
10
参数说明:
 
     * activityId 一定是请求时存在的活动id
     * quantity > 0
 
返回值有以下三种情况:
 
     * 购买成功,减少库存,返回 0
     * 购买数量大于秒杀商品剩余数量,购买失败,返回- 1
     * 秒杀未开始或已结束,购买失败,返回- 1

3. 获取秒杀活动列表 getActivityList() 获取当前时刻的秒杀活动列表

1
2
3
4
5
6
7
8
秒杀列表排序方式:进行中(未售罄) > 进行中(售罄) > 未开始
 
     * 对于「进行中(未售罄)」:依次按商品人气值从高到低、商品ID从小到大排序
     * 对于「进行中(已售罄)」:依次按最后卖出时间从晚到早、商品人气值从高到低、商品ID从小到大排序
     * 对于「未开始」:依次按开始时间从早到晚、商品人气值从高到低、商品ID从小到大排序
     * 对于已结束的秒杀,不返回。
 
返回秒杀活动id列表

商品拥有以下属性:

1
2
3
* 商品ID, 32 位非负整数
* 人气值, 32 位非负整数
* 库存, 32 位非负整数

现给出一串请求,每个请求的格式为:时间戳 函数名 参数。请对每个请求都输出其返回结果 (请求已经按照时间先后顺序排序过) 。

数据范围:

1
2
3
4
5
* 商品数量 N <= 10 , 000
* 请求数量 M <= 10 , 000
* add 数量 A <= 1 , 000
* buy 数量 B <= 10 , 000
* list 数量 L <= 100

输入描述:

1
2
3
4
5
6
7
第一行是两个整数 N 和 M ,分别表示商品数量和请求数量。
接下来有 N 行,每行表示一个商品,具体格式为: 3 个整数(被空格分隔)分别表示商品ID,人气值,库存
接下来有 M 行,每行表示一个请求,请求已经按时间戳从小到大排序。
具体格式为:时间戳 请求类型 请求参数...
   * 时间戳:正整数
   * 请求类型,共三种: "add" , "buy" "list"
   * 请求参数:按题目描述中的顺序,参数之间空格分隔

输出描述:

1
2
3
4
对每个请求,输出其返回值,一个请求的输出占一行:
   * add:成功输出id,失败输出- 1
   * buy:成功输出 0 ,失败输出- 1
   * list:输出活动id列表,按要求的顺序,相邻数字之间用一个空格分隔。若列表为空,则输出空行。

示例1

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
6 13
1001 1 10
1002 1 10
1003 2 10
1004 2 10
1005 2 10
1006 3 10
1 add 2 20 1001 10
2 buy 0 1
3 buy 0 10
4 add 5 6 1002 2
5 list
6 buy 1 1
7 add 10 20 1003 11
8 add 10 20 1003 8
9 add 10 20 1004 3
10 add 11 20 1005 5
11 add 20 30 1006 1
12 buy 3 3
13 list

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
0
0
- 1
1
0 1
- 1
- 1
2
3
4
5
0
2 4 0 3 5
思路:核心数据结构是两个表,每个表里各存储一个结构体:商品、活动。每次根据请求和时间戳更新两个表和表里的结构体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值