İlk halka arz ihalesi
Görüntü transkripsiyonu:
Bir şirket bir halka arz için kaydolur. Tüm hisseler, teklif penceresi adı verilen bir zaman dilimi boyunca teklif vermek için web sitesinde mevcuttur. İhale penceresinin sonunda, hangisi önce gelirse, tüm hisseler tahsis edilene kadar veya tüm teklif sahipleri teklif verdikleri hisseleri alana kadar, hangi teklif verene kaç adet mevcut hissenin gideceğine karar vermek için bir açık artırma mantığı kullanılır.
Teklifler, teklif penceresi kapanana kadar kullanıcılardan [kullanıcı kimliği, # hisse, teklif fiyatı, zaman damgası] şeklinde gelir.
Açık artırma mantığı, hisseleri şu şekilde atar:
En yüksek fiyata sahip teklif veren, teklif ettiği hisse adedini alır
Birden fazla teklif verenin aynı fiyattan teklif vermesi durumunda, teklif sahiplerine tekliflerini verdikleri sıraya göre hisse atanır (ilk teklifler önce)
Tüm hisseler tahsis edildikten sonra 1 pay bile almayan tüm kullanıcıların kullanıcı kimliklerini listeleyin.
Giriş
[kullanıcı kimliği, # paylaşım, $ teklif, zaman damgası] 'nı temsil eden giriş listelerinin teklifler listesi- totalShares dağıtılacak
toplam hisse sayısı.
Yapmak
hisseleri teklif verenler arasında dağıtmak ve 0 hissesi olan teklif sahiplerinin kullanıcı kimliklerini iade etmek.
Dağıtım mantığını paylaşın:
- En yüksek teklife sahip teklif veren, teklif ettiği tüm hisseleri alır ve sonra
- $ teklif fiyatında bağlar varsa, hisseleri önceki teklif verene atayın.
Bulduğum çözümün nispeten basit olduğunu hissediyorum. Aklıma gelen tüm uç durumlardan geçiyor gibi görünüyor.
Soru
Şüpheli bir durum buldum:
Teklif fiyatı ve süreleri aynı ve tüm teklif verenler için yeterli hisse yok, yani: bids
eşittir [[0,2,10,0], [1,2,10,0]]
ve totalShares
öyle 2
. Her birine 1 paylaşım verilmesi mi gerektiği yoksa userid 0'ın her ikisini birden mi alacağı belli değil.
Kod
Çözümüm yine de optimize edilebilir mi?
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
Yanıtlar
Problemde verilen fonksiyon adını kullanın:
def getUnallottedUsers(bids, totalShares):
Sorun, tüm teklif verenler için yeterli hisse bulunma olasılığı hakkında herhangi bir bilgi sağlamaz, bu nedenle IMO ilk döngü, erken optimizasyon örneğidir.
"Sihirli sayılar" yerine sabitler kullanın. Anlamlı isimler kullanın. Yaygın biçimlendirme kuralları hakkında PEP8'e bir göz atın. Bunlar, kodu okunabilir hale getirmede uzun bir yol kat ediyor.
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
Sorulan soruyu yanıtlayın: "İşlev, her biri hiç hisse almayan teklif sahipleri için bir kimlik olan ve artan düzende sıralanmış bir tam sayılar listesi döndürmelidir. "
return sorted(bid[USERID] for bid in bids[index + 1:])
Hep birlikte:
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:])
Veya bir yineleyici kullanın:
bids = iter(bids)
while totalShares > 0:
price = next(bid)[PRICE]
totalShares -= price
return sorted(bid[USERID] for bid in bids)