我的一個朋友在初級 Python 開發人員的面試中被問到以下問題。
一棟樓只有一部電梯。員工排隊等候電梯。電梯具有最大質量容量。電梯要運行多少次?在(有序)串列中提供了大量乘客。
下面的 C 風格回圈將完成這項作業,真的,但是對于這樣一個規范的問題,難道沒有一個簡潔的(希望是單行的)嗎?
#!/usr/bin/env python3
MAX_MASS = 280 # kg
def how_many(masses):
trips = 0
total_mass = 0
for m in masses:
# Elevator full - depart.
if total_mass m > MAX_MASS:
trips = trips 1
total_mass = 0
total_mass = total_mass m
# Not full but some passagers remain.
if total_mass > 0:
trips = trips 1
return trips
if __name__ == '__main__':
passangers = [19, 22, 34, 33, 82, 91, 77, 31, 87]
trips = how_many(passangers)
print(trips)
uj5u.com熱心網友回復:
你可以用它itertoosl.accumulate來縮短一點:
from itertools import accumulate as acc
def trips(masses, mm):
i = res = 0
while i < len(masses):
res = 1
i = next((i for i, a in enumerate(acc(masses[i:]), i) if a > mm), len(masses))
return res
從演算法上講,切片很麻煩(O(K)在時間和空間上),但您可以將其替換masses[i:]為islice(masses, i, None).
如果允許遞回,則可以將其歸結為:
def trips(masses, mm):
if not (n := len(masses)):
return 0
return 1 trips(masses[next((i for i, a in enumerate(acc(masses)) if a > mm), n):], mm)
trips([19, 22, 34, 33, 82, 91, 77, 31, 87], 280)
# 3
一些檔案:
itertools.accumulateenumeratenextitertools.islice
uj5u.com熱心網友回復:
這是使用的解決方案reduce:
from functools import reduce
def how_many(masses, MAX_MASS):
def my_func(acc, m):
trips, tmp = acc
return (trips 1, m) if tmp m > MAX_MASS else (trips, tmp m)
return reduce(my_func, masses, (1, 0))[0]
呼叫reduce回傳一個元組,因此我們取第一個元素,即行程數。
uj5u.com熱心網友回復:
我猜你可能會濫用textwrap。
from textwrap import wrap
def how_many(masses):
return len(wrap(' '.join('.' * (m-1) for m in masses), MAX_MASS-1))
(當員工的質量為 1 kg 時,可能會產生錯誤的結果,但這似乎不太可能。)
uj5u.com熱心網友回復:
當質量變得太多時,使用split_beforefrom modulemore_itertools進行拆分;并使用ilen來自同一個模塊來計算拆分。
from more_itertools import split_before, ilen
def count_trips(seq, max_mass):
def acc(x):
if acc.mass x <= max_mass:
acc.mass = x
return False
else:
acc.mass = x
return True
acc.mass = 0
return ilen(split_before(seq, acc))
print(count_trips([19, 22, 34, 33, 82, 91, 77, 31, 87], 280))
# 3 ( [[19, 22, 34, 33, 82], [91, 77, 31], [87]] )
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/346339.html
下一篇:添加屬性后獲取初始空物件的屬性
