实现一个简易的秒杀服务,有3个接口:

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

参数说明:

* 时间区间为左闭右开:[startTime, endTime) 。数据保证 startTime < endTime,startTime 大于当前时间戳

* goodsId 一定为存在的商品id。每个goodsId至多添加一次秒杀活动。

* limitQuantity > 0

返回值有以下两种情况:

* 添加成功,返回秒杀活动ID (从0开始自增)

* 秒杀商品数量大于商品库存,添加失败,返回-1

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

参数说明:

* activityId 一定是请求时存在的活动id

* quantity > 0

返回值有以下三种情况:

* 购买成功,减少库存,返回0

* 购买数量大于秒杀商品剩余数量,购买失败,返回-1

* 秒杀未开始或已结束,购买失败,返回-1

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

秒杀列表排序方式:进行中(未售罄) > 进行中(售罄) > 未开始

* 对于「进行中(未售罄)」:依次按商品人气值从高到低、商品ID从小到大排序

* 对于「进行中(已售罄)」:依次按最后卖出时间从晚到早、商品人气值从高到低、商品ID从小到大排序

* 对于「未开始」:依次按开始时间从早到晚、商品人气值从高到低、商品ID从小到大排序

* 对于已结束的秒杀,不返回。

返回秒杀活动id列表

商品拥有以下属性:

* 商品ID,32位非负整数

* 人气值,32位非负整数

* 库存,32位非负整数

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

数据范围:

* 商品数量 N <= 10,000

* 请求数量 M <= 10,000

* add 数量 A <= 1,000

* buy 数量 B <= 10,000

* list 数量 L <= 100

输入描述:

第一行是两个整数 N 和 M ,分别表示商品数量和请求数量。

接下来有 N 行,每行表示一个商品,具体格式为:3个整数(被空格分隔)分别表示商品ID,人气值,库存

接下来有 M 行,每行表示一个请求,请求已经按时间戳从小到大排序。

具体格式为:时间戳 请求类型 请求参数...

* 时间戳:正整数

* 请求类型,共三种:"add", "buy" 和 "list"

* 请求参数:按题目描述中的顺序,参数之间空格分隔

输出描述:

对每个请求,输出其返回值,一个请求的输出占一行:

* add:成功输出id,失败输出-1

* buy:成功输出0,失败输出-1

* list:输出活动id列表,按要求的顺序,相邻数字之间用一个空格分隔。若列表为空,则输出空行。

示例1

输入

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

输出

0

0

-1

1

0 1

-1

-1

2

3

4

5

0

2 4 0 3 5

下面是我的python 解法,由于题目复杂,当时一下没A出来,后来补全了下

s = raw_input().split(" ")

n, m = int(s[0]), int(s[1])

class Good(object):

def __init__(self, good_id, pop, num):

self.good_id = good_id

self.pop = pop

self.num = num

class Activity(object):

index = 0

def __init__(self, start_time, end_time, good_object, limit):

self.start_time = start_time

self.end_time = end_time

self.good_object = good_object

self.limit = limit

self.last_sell = 0

self.activity_id = Activity.index

Activity.index += 1

goods_dict = dict()

for i in xrange(n):

s = raw_input().split(" ")

good_id = int(s[0])

pop = int(s[1])

num = int(s[2])

goods_dict[good_id] = Good(good_id, pop, num)

unstart_dict = dict()

running_dict = dict()

empty_dict = dict()

def update(moment):

del_list = []

for key, item in empty_dict.iteritems():

if item.end_time <= moment:

del_list.append(key)

for key in del_list:

del empty_dict[key]

del_list = []

for key, item in running_dict.iteritems():

if item.end_time <= moment:

del_list.append(key)

continue

if item.limit <= 0:

empty_dict[key] = item

del_list.append(key)

for key in del_list:

del running_dict[key]

del_list = []

for key, item in unstart_dict.iteritems():

if item.start_time <= moment:

running_dict[key] = item

del_list.append(key)

for key in del_list:

del unstart_dict[key]

# print "unstart_dict", str(unstart_dict)

# print "running_dict", str(running_dict)

# print "empty_dict", str(empty_dict)

for i in xrange(1, m + 1):

update(i)

s = raw_input().split(" ")

op = s[1]

if op == "add":

start_time = int(s[2])

end_time = int(s[3])

good_id = int(s[4])

limit = int(s[5])

if limit > goods_dict[good_id].num:

print -1

continue

activity = Activity(start_time, end_time, goods_dict[good_id], limit)

unstart_dict[activity.activity_id] = activity

print activity.activity_id

elif op == "buy":

activity_id = int(s[2])

quantity = int(s[3])

if activity_id in running_dict and running_dict[activity_id].limit >= quantity:

running_dict[activity_id].limit -= quantity

running_dict[activity_id].good_object.num -= quantity

running_dict[activity_id].last_sell = i

print 0

else:

print -1

elif op == "list":

def cmp_unstart(x, y):

if x.start_time == y.start_time:

if x.good_object.pop == y.good_object.pop:

return x.good_object.good_id - y.good_object.good_id

return y.good_object.pop - x.good_object.pop

return x.start_time - y.start_time

def cmp_running(x, y):

if x.good_object.pop == y.good_object.pop:

return x.good_object.good_id - y.good_object.good_id

return y.good_object.pop - x.good_object.pop

def cmp_empty(x, y):

if x.last_sell == y.last_sell:

if x.good_object.pop == y.good_object.pop:

return x.good_object.good_id - y.good_object.good_id

return y.good_object.pop - x.good_object.pop

return y.last_sell - x.last_sell

unstart_list = sorted(unstart_dict.values(), cmp=cmp_unstart)

running_list = sorted(running_dict.values(), cmp=cmp_running)

empty_list = sorted(empty_dict.values(), cmp=cmp_empty)

for activity in running_list:

print activity.activity_id,

for activity in empty_list:

print activity.activity_id,

for activity in unstart_list:

print activity.activity_id,

print ""

大家看下有没有更好的方法~

python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务相关推荐

  1. 拼多多2020学霸批数据分析师笔试题 (2019.7.28)

    真真正正20届秋招,第一场笔试献给了「拼多多」. 套题 20届学霸批数据分析师笔试题 题型简单粗暴 5道问答题:3 * SQL + 1 * 概率计算 + 1 * 业务分析题 完成时间 90分钟 会写的 ...

  2. python开发面试题目_Python测试开发面试笔试题

    Python 测试开发面试笔试题 一,中文单项选择题(30 分,每个 3 分) 1.下列哪个语句在 Python 中是非法的? A.x = y = z = 1 B.x = (y = z + 1) C. ...

  3. Python求解进制问题(阿里巴巴2015笔试题)

    问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0? 解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定 ...

  4. 拼多多2021校招2020.9.1笔试题 T2 and T4

    T1简单没套路,T3 a不完..所以只有T2和T4 import java.util.HashSet; import java.util.LinkedList; import java.util.Qu ...

  5. python数据挖掘面试题_数据挖掘150道笔试题

    作者:白宁超 2016年10月16日13:44:06 摘要:正值找工作之际,数据挖掘150道面试题涵盖很多基础知识点,如果你针对求职提前针对性准备,可以以此为为参照检查自己水平,如果你不为求职,也可以 ...

  6. Python求解啤酒问题(携程2016笔试题)

    问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升, 并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客 ...

  7. 这段代码,c 1秒,java 9秒,c# 14秒,而python。。。,java初级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  8. java字符串笔试题_五道Java常见笔试题及答案汇总

    1.String和StringBuffer的区别? 答:Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数 ...

  9. concurre分段锁 put 流程图_一道有趣的笔试题(三)、锁存器Latch

    看到了一些interesting的题,和大家分享一下,如果大家有什么额外的见解欢迎大家公众号后台留言! 题目: 生成锁存器不是看是否补全else,或者所有的case情况都考虑到,而是看电路有没有保持! ...

最新文章

  1. 在虚拟机中安装Windows Server 2008企业版
  2. @configurationproperties注解给属性赋值
  3. 解决Maven报Plugin execution not covered by lifecycle configuration
  4. vue方法传值到data_Vue 组件传值几种常用方法【总结】
  5. 【TensorFlow】TensorFlow函数精讲之tf.train.ExponentialMovingAverage()
  6. memcached常用命令
  7. java压缩传输gzip_服务器使用Gzip压缩数据,加快网络传输(Java 例子)
  8. 3.10 触发字检测
  9. 继Spring 会议个人计划统计(补)
  10. silverlight DataPager控件
  11. jQuery:节点操作、事件操作
  12. 图片怎么去底色?怎么去图片背景为透明?
  13. 图说: 量子物理学的主要内容
  14. 【C语言】1-100求和;1-N求和
  15. Python 十进制转换二进制
  16. POR BOR LVD
  17. 修改只读文件权限并修改文件
  18. 推荐一部励志电视剧《山海情》
  19. 从零开始制作一个飞机大战类型的射击游戏
  20. 【刷题打卡】day7-BFS

热门文章

  1. 软件定义的网络体系结构是否使用网段路由?—Vecloud微云
  2. 企业要SD-WAN组网,请先评估这些问题
  3. PaddleOCR加载chinese_ocr_db_crnn_server/chinese_ocr_db_crnn_modile模型进行中英文混合预测(代码)实践
  4. Linux开机自启动配置
  5. 普通用户程序使用保留端口 error while loading shared libraries
  6. 力扣——所有可能的满二叉树
  7. 437. Path Sum III
  8. linux内核启动时报错ubi0 error: validate_ec_hdr: bad data offset 256, expected 128
  9. 保存训练好的模型并调用
  10. 关于数位动规(入门到进阶,难度中档)