python實現完整的求解給定列表中所有的平衡點問題,是所有的平衡點
阿新 • • 發佈:2019-01-24
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能:尋找平衡點
'''
def find_balance_point(numbers):
'''
網上的程式碼,尋找平衡點
來源於:http://blog.renren.com/share/235087438/3004327956
測試資料:numbers = [1,3,5,7,8,2,4,20]
缺點:你可以交換列表中的資料可以發現結果錯誤,可能正是他們的對於
平衡點的定義不同,都按照簡單版本的來了
'''
total=sum(numbers)
fore=0
for number in numbers:
if fore<(total-number)/2:
fore+=number
else:
break
if fore == (total-number)/2:
print number
else:
print r'not found'
def split_list(num_list):
'''
輸入一個列表,判斷是否可以劃分為大小相等的兩個子列表,可以返回True不可以返回False
'''
total=sum(num_list)
half=total/2
if int(half)!=half:
return False
else:
all_sub_list=get_list_all_sub_list(num_list)
i=0
flag=False
while i<len(all_sub_list):
one_list=all_sub_list[i]
two_list=[one for one in num_list if one not in one_list]
if sum(one_list)==sum(two_list):
flag=True
break
else:
i+=1
if flag:
return True
else:
return False
def main_func(num_list):
'''
輸入一個列表判斷是否存在平衡點
'''
res=False
for i in range(len(num_list)):
temp_list=num_list[:]
flag=temp_list.pop(i)
if split_list(temp_list):
res=True
print '平衡點為:', flag
if not res:
print '不存在平衡點!!!'
def get_list_all_sub_list(num_list):
'''
輸入一個列表,返回該列表所有的子列表,這裡定義的空列表不屬於子列表,故:子列表最小長度為1
'''
if len(num_list)==1:
return [num_list]
sub_list=get_list_all_sub_list(num_list[:-1])
extra=num_list[-1:]
temp_list=[]
for one in sub_list:
temp_list.append(one+extra)
return sub_list+temp_list
if __name__ == '__main__':
num_list=[1,3,2,4,5,7,8,20]
num_list2=[1,3,2,4,5,7,8,200,9000,300000]
print '*********************************網上程式碼測試*********************************'
find_balance_point(num_list)
find_balance_point(num_list2)
print '*********************************自己的程式碼測試*********************************'
main_func(num_list)
print '------------------------------------------------------------------------------------'
main_func(num_list2)