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

Aug 16 2020

การถอดเสียงภาพ:

บริษัท ลงทะเบียนสำหรับการเสนอขายหุ้น IPO หุ้นทั้งหมดมีอยู่บนเว็บไซต์สำหรับการเสนอราคาในช่วงเวลาที่เรียกว่าหน้าต่างการเสนอราคา ในตอนท้ายของหน้าต่างการเสนอราคาจะมีการใช้ตรรกะในการตัดสินใจว่าจำนวนหุ้นที่มีอยู่จะไปถึงผู้ประมูลรายใดจนกว่าจะได้รับการจัดสรรหุ้นทั้งหมดหรือผู้ประมูลทั้งหมดได้รับหุ้นที่ตนเสนอราคาแล้วแต่อย่างใดจะถึงก่อน

ราคาเสนอมาจากผู้ใช้ในรูปแบบ [userid, # share, bidding price, timestamp] จนกว่าหน้าต่างการเสนอราคาจะปิดลง

ตรรกะการประมูลกำหนดหุ้นดังนี้:

  1. ผู้ประมูลที่มีราคาสูงสุดจะได้รับจำนวนหุ้นที่ประมูลได้

  2. หากผู้ประมูลหลายรายเสนอราคาในราคาเดียวกันผู้ประมูลจะได้รับการกำหนดหุ้นตามลำดับที่พวกเขาเสนอราคา (เสนอราคาเร็วที่สุดก่อน)

ระบุรหัสผู้ใช้ของผู้ใช้ทั้งหมดที่ไม่ได้รับแม้แต่ 1 หุ้นหลังจากจัดสรรหุ้นทั้งหมดแล้ว

อินพุต


  • รายการราคาเสนอของรายการ ints ที่แสดงถึง [userid, # share, $ bid, timestamp]
  • totalShares
    จำนวนหุ้นทั้งหมดที่จะกระจาย

ทำ

กระจายหุ้นระหว่างผู้ประมูลและส่งคืนผู้ใช้ของผู้ประมูลที่ได้ 0 หุ้น

แบ่งปันตรรกะการกระจาย:

  1. ผู้เสนอราคาที่มีข้อเสนอสูงสุดจะได้รับหุ้นทั้งหมดที่เสนอราคาและจากนั้น
  2. หากมีความสัมพันธ์กับราคาประมูล $ ให้มอบหมายหุ้นให้กับผู้เสนอราคาก่อนหน้านี้

ฉันรู้สึกว่าวิธีแก้ปัญหาที่ฉันคิดขึ้นมานั้นค่อนข้างง่าย ดูเหมือนว่าจะผ่านพ้นทุกกรณีที่ฉันคิดได้

คำถาม

ฉันได้พบสถานการณ์ที่น่าสงสัย:
ราคาประมูลและเวลาเหมือนกันและมีไม่เพียงพอสำหรับหุ้นที่ผู้ชนะการประมูลทั้งหมดคือ: 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

คำตอบ

2 RootTwo Aug 18 2020 at 09:39

ใช้ชื่อฟังก์ชันที่ระบุในปัญหา:

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)