在知乎上看到一个趣味编程,自己想了个方法,记录下来。
用python编程解决这个问题,想到的解决办法是:一层一层的加,直到柱子不能圈住雨水。实现起来就是递归思想。
直接上代码:
def getrainvolum(inputlist):
templist=[]
for ele in inputlist:
if ele>=1:
templist.append(1)
else:
templist.append(0)
templist_str= "".join([str(x) for x in templist]).strip('0')
count_list=[int(x) for x in templist_str]
newinputlist = []
for i in range(len(inputlist)):
newinputlist.append(inputlist[i]-templist[i])
rain_count=len(count_list)-sum(count_list)
if len(newinputlist)==1 or sum(newinputlist)<=1:
return rain_count
else:
return rain_count+getrainvolum(newinputlist)
if __name__ == '__main__':
input=[0,1,0,2,1,0,1,3,2,1,2,1]
rain_sum=getrainvolum(input)
print(rain_sum)
简单的测试的几组数据,貌似没有大的问题。
假如把柱子的高度可以是小数,那么该怎么解决呢?同样的还是采用递归,一层一层的加,只是这里的一层和上面柱子高度整数的时候,层的高度不一样。这里的层高都不一样。
def getrainvolum(inputlist):
templist=[]
sort_inputlist=sorted(inputlist,reverse=False)
min_hright=0
for h in sort_inputlist:
if h!=0:
min_hright=h
break
for ele in inputlist:
if ele!=0:
templist.append(min_hright)
else:
templist.append(0)
count_list=deletezerofirstlast(templist)
newinputlist = []
for i in range(len(inputlist)):
newinputlist.append(inputlist[i]-templist[i])
rain_count=len(count_list)*min_hright-sum(count_list)
if islistelemthesmae(newinputlist)==2:
return rain_count
else:
return rain_count+getrainvolum(newinputlist)
def deletezerofirstlast(array):
right=0
for a in array:
if a==0.0:
right+=1
else:
break
left=0
for a in array[::-1]:
if a==0.0:
left+=1
else:
break
print('left:',left)
return array[right:len(array)-left]
def islistelemthesmae(list):
s=set(list)
return len(s)
if __name__ == '__main__':
input=[0,0.9,0,2,1,0,1,2.5,2,1,2,1]
rain_sum=getrainvolum(input)
print(rain_sum)
记录的作用就是熟悉递归的思想和应用。
有其他更好的方法,反应告知,有错误的话也可以指出,谢谢!