python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务
實(shí)現(xiàn)一個(gè)簡(jiǎn)易的秒殺服務(wù),有3個(gè)接口:
1. 添加一個(gè)秒殺活動(dòng) addActivity(int startTime, int endTime, int goodsId, int limitQuantity)
參數(shù)說明:
* 時(shí)間區(qū)間為左閉右開:[startTime, endTime) 。數(shù)據(jù)保證 startTime < endTime,startTime 大于當(dāng)前時(shí)間戳
* goodsId 一定為存在的商品id。每個(gè)goodsId至多添加一次秒殺活動(dòng)。
* limitQuantity > 0
返回值有以下兩種情況:
* 添加成功,返回秒殺活動(dòng)ID (從0開始自增)
* 秒殺商品數(shù)量大于商品庫(kù)存,添加失敗,返回-1
2. 購(gòu)買秒殺商品 buyGoods(int activityId, int quantity)
參數(shù)說明:
* activityId 一定是請(qǐng)求時(shí)存在的活動(dòng)id
* quantity > 0
返回值有以下三種情況:
* 購(gòu)買成功,減少庫(kù)存,返回0
* 購(gòu)買數(shù)量大于秒殺商品剩余數(shù)量,購(gòu)買失敗,返回-1
* 秒殺未開始或已結(jié)束,購(gòu)買失敗,返回-1
3. 獲取秒殺活動(dòng)列表 getActivityList() 獲取當(dāng)前時(shí)刻的秒殺活動(dòng)列表
秒殺列表排序方式:進(jìn)行中(未售罄) > 進(jìn)行中(售罄) > 未開始
* 對(duì)于「進(jìn)行中(未售罄)」:依次按商品人氣值從高到低、商品ID從小到大排序
* 對(duì)于「進(jìn)行中(已售罄)」:依次按最后賣出時(shí)間從晚到早、商品人氣值從高到低、商品ID從小到大排序
* 對(duì)于「未開始」:依次按開始時(shí)間從早到晚、商品人氣值從高到低、商品ID從小到大排序
* 對(duì)于已結(jié)束的秒殺,不返回。
返回秒殺活動(dòng)id列表
商品擁有以下屬性:
* 商品ID,32位非負(fù)整數(shù)
* 人氣值,32位非負(fù)整數(shù)
* 庫(kù)存,32位非負(fù)整數(shù)
現(xiàn)給出一串請(qǐng)求,每個(gè)請(qǐng)求的格式為:時(shí)間戳 函數(shù)名 參數(shù)。請(qǐng)對(duì)每個(gè)請(qǐng)求都輸出其返回結(jié)果 (請(qǐng)求已經(jīng)按照時(shí)間先后順序排序過) 。
數(shù)據(jù)范圍:
* 商品數(shù)量 N <= 10,000
* 請(qǐng)求數(shù)量 M <= 10,000
* add 數(shù)量 A <= 1,000
* buy 數(shù)量 B <= 10,000
* list 數(shù)量 L <= 100
輸入描述:
第一行是兩個(gè)整數(shù) N 和 M ,分別表示商品數(shù)量和請(qǐng)求數(shù)量。
接下來有 N 行,每行表示一個(gè)商品,具體格式為:3個(gè)整數(shù)(被空格分隔)分別表示商品ID,人氣值,庫(kù)存
接下來有 M 行,每行表示一個(gè)請(qǐng)求,請(qǐng)求已經(jīng)按時(shí)間戳從小到大排序。
具體格式為:時(shí)間戳 請(qǐng)求類型 請(qǐng)求參數(shù)...
* 時(shí)間戳:正整數(shù)
* 請(qǐng)求類型,共三種:"add", "buy" 和 "list"
* 請(qǐng)求參數(shù):按題目描述中的順序,參數(shù)之間空格分隔
輸出描述:
對(duì)每個(gè)請(qǐng)求,輸出其返回值,一個(gè)請(qǐng)求的輸出占一行:
* add:成功輸出id,失敗輸出-1
* buy:成功輸出0,失敗輸出-1
* list:輸出活動(dòng)id列表,按要求的順序,相鄰數(shù)字之間用一個(gè)空格分隔。若列表為空,則輸出空行。
示例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 解法,由于題目復(fù)雜,當(dāng)時(shí)一下沒A出來,后來補(bǔ)全了下
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 ""
大家看下有沒有更好的方法~
總結(jié)
以上是生活随笔為你收集整理的python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间排序python_算法导论 第八章
- 下一篇: centos7 python3.6升级到