การประมูลเสนอขายต่อประชาชนครั้งแรก

การถอดเสียงภาพ:
บริษัท ลงทะเบียนสำหรับการเสนอขายหุ้น IPO หุ้นทั้งหมดมีอยู่บนเว็บไซต์สำหรับการเสนอราคาในช่วงเวลาที่เรียกว่าหน้าต่างการเสนอราคา ในตอนท้ายของหน้าต่างการเสนอราคาจะมีการใช้ตรรกะในการตัดสินใจว่าจำนวนหุ้นที่มีอยู่จะไปถึงผู้ประมูลรายใดจนกว่าจะได้รับการจัดสรรหุ้นทั้งหมดหรือผู้ประมูลทั้งหมดได้รับหุ้นที่ตนเสนอราคาแล้วแต่อย่างใดจะถึงก่อน
ราคาเสนอมาจากผู้ใช้ในรูปแบบ [userid, # share, bidding price, timestamp] จนกว่าหน้าต่างการเสนอราคาจะปิดลง
ตรรกะการประมูลกำหนดหุ้นดังนี้:
ผู้ประมูลที่มีราคาสูงสุดจะได้รับจำนวนหุ้นที่ประมูลได้
หากผู้ประมูลหลายรายเสนอราคาในราคาเดียวกันผู้ประมูลจะได้รับการกำหนดหุ้นตามลำดับที่พวกเขาเสนอราคา (เสนอราคาเร็วที่สุดก่อน)
ระบุรหัสผู้ใช้ของผู้ใช้ทั้งหมดที่ไม่ได้รับแม้แต่ 1 หุ้นหลังจากจัดสรรหุ้นทั้งหมดแล้ว
อินพุต
รายการราคาเสนอของรายการ ints ที่แสดงถึง [userid, # share, $ bid, timestamp]- totalShares
จำนวนหุ้นทั้งหมดที่จะกระจาย
ทำ
กระจายหุ้นระหว่างผู้ประมูลและส่งคืนผู้ใช้ของผู้ประมูลที่ได้ 0 หุ้น
แบ่งปันตรรกะการกระจาย:
- ผู้เสนอราคาที่มีข้อเสนอสูงสุดจะได้รับหุ้นทั้งหมดที่เสนอราคาและจากนั้น
- หากมีความสัมพันธ์กับราคาประมูล $ ให้มอบหมายหุ้นให้กับผู้เสนอราคาก่อนหน้านี้
ฉันรู้สึกว่าวิธีแก้ปัญหาที่ฉันคิดขึ้นมานั้นค่อนข้างง่าย ดูเหมือนว่าจะผ่านพ้นทุกกรณีที่ฉันคิดได้
คำถาม
ฉันได้พบสถานการณ์ที่น่าสงสัย:
ราคาประมูลและเวลาเหมือนกันและมีไม่เพียงพอสำหรับหุ้นที่ผู้ชนะการประมูลทั้งหมดคือ: bids
เป็น[[0,2,10,0], [1,2,10,0]]
และเป็นtotalShares
2
ยังไม่ชัดเจนว่าควรให้ 1 แชร์ต่อหรือ userid 0 ได้รับทั้ง 2 อย่าง
รหัส
โซลูชันของฉันสามารถปรับให้เหมาะสมได้หรือไม่
def getUnallocatesUsers(bids, totalShares):
s = 0
for b in bids:
s += b[1]
if totalShares >= s: return [] # no losers because enough shares to go around
bids.sort(key = lambda x: (-x[2],x[3])) # sort by highest bid, then timestamp for ties
losers = []
for b in bids:
if totalShares <= 0: losers.append(b[0])
else:
totalShares -= b[1]
return losers
คำตอบ
ใช้ชื่อฟังก์ชันที่ระบุในปัญหา:
def getUnallottedUsers(bids, totalShares):
ปัญหาไม่ได้ให้ข้อมูลใด ๆ เกี่ยวกับความเป็นไปได้ที่จะมีการแบ่งปันเพียงพอสำหรับผู้เสนอราคาทั้งหมดดังนั้น IMO ตัวแรกสำหรับวงจึงเป็นตัวอย่างของการเพิ่มประสิทธิภาพก่อนกำหนด
ใช้ค่าคงที่แทน "ตัวเลขวิเศษ" ใช้ชื่อที่มีความหมาย ดู PEP8 เกี่ยวกับรูปแบบการจัดรูปแบบทั่วไป สิ่งเหล่านี้ไปไกลในการทำให้โค้ดอ่านได้
USERID = 0
SHARES = 1
PRICE = 2
TIME = 3
bids.sort(key=lambda bid:(-bid[PRICE], bid[TIME]))
for index, bid in enumerate(bids):
totalShares -= bid[SHARES]
if totalShares <= 0:
break
ตอบคำถามที่ถูกถาม: "ฟังก์ชันจะต้องส่งคืนรายการจำนวนเต็มโดยแต่ละรหัสสำหรับผู้ประมูลที่ไม่ได้รับหุ้นจะเรียงลำดับจากน้อยไปมาก "
return sorted(bid[USERID] for bid in bids[index + 1:])
ทั้งหมดเข้าด้วยกัน:
USERID = 0
SHARES = 1
PRICE = 2
TIME = 3
def getUnallottedUsers(bids, totalShares):
bids.sort(key=lambda bid:(-bid[PRICE], bid[TIME]))
for index, bid in enumerate(bids):
totalShares -= bid[SHARES]
if totalShares <= 0:
break
return sorted(bid[USERID] for bid in bids[index + 1:])
หรือใช้ตัววนซ้ำ:
bids = iter(bids)
while totalShares > 0:
price = next(bid)[PRICE]
totalShares -= price
return sorted(bid[USERID] for bid in bids)