我正试图解决以下问题:
“你想用灌水罐给花园里的植物浇水。这些植物排列成一排,从左到右标记为从0到n -1,第一棵植物位于x= i处。在x=-1处有一条河流,你可以在那里重新灌水。”
每个植物都需要一定量的水。你将用以下方式浇水:
按顺序从左到右浇水。在给现有的植物浇水后,如果没有足够的水完全浇灌下一棵植物,则返回河里充分灌装浇水罐。你不能早早给灌水罐加满水。你最初在河边(即x= -1)。在x轴上移动一个单元需要一步。
给定n个整数的0索引整数数组植物,其中plantsi是ith工厂需要的水量,以及表示浇水罐容量的整数,则返回所有植物浇水所需的步骤数。“
下面是我的代码,它通过7项检查,但不通过以下操作: plants=3,2,4,2,1 capacity=6
你能告诉我哪里出了问题吗?
def wateringPlants(self, plants: List[int], capacity: int) -> int:
steps=0;
for i in range(0,len(plants)):
if plants[i]<=capacity:
steps=steps+1;
capacity=capacity-plants[i];
else:
capacity=capacity;
steps=steps+2*i+1;
capacity=capacity-plants[i];
return steps```发布于 2022-10-18 14:47:15
代码的问题在于,您将capacity当作是指浇水罐中当前的水量;您实际上需要一个单独的变量来跟踪它。
下面是对您的代码所做的最小更改,它将产生正确的结果。
def wateringPlants(self, plants: List[int], capacity: int) -> int:
steps=0;
amount_water = capacity
for i in range(0,len(plants)):
if plants[i]<=amount_water:
steps=steps+1;
amount_water = amount_water-plants[i];
else:
amount_water = capacity;
steps = steps+2*i+1;
amount_water = amount_water - plants[i];
return steps下面是对上述代码的3次重构,我认为这些重构更合理一些。
备选案文1:
def wateringPlants(self, plants: List[int], capacity: int) -> int:
i = steps = 0
amount_water = capacity
while i < len(plants):
if plants[i]<=amount_water:
steps+=1
amount_water -= plants[i]
i+=1
else:
amount_water = capacity
steps += 2*i
return steps注意:这依赖于plants[i]总是小于或等于capacity这一事实。否则,这段代码可能会导致无限循环。
备选案文2:
def wateringPlants(self, plants: List[int], capacity: int) -> int:
steps = 0
amount_water = capacity
for i in range(len(plants)):
if plants[i] > amount_water:
steps += 2*i
amount_water = capacity
amount_water -= plants[i]
steps += 1
return steps选项3:不要重复添加1,只需添加列表的长度即可。
def wateringPlants(self, plants: List[int], capacity: int) -> int:
extra_steps = 0
amount_water = capacity
for i,p in enumerate(plants):
if p > amount_water:
extra_steps += 2*i
amount_water = capacity
amount_water -= p
return extra_steps + i + 1https://stackoverflow.com/questions/74112636
复制相似问题