谢谢网友Done 的提醒,下面解法错误,但也可以看看,当是一个典型吧.另外,最近都学英语了,没碰编程了.明年有时间再看这题目吧.
原题:
有一序列a,大小为n,分为2部分,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小,用python写。
限时十分钟以内
我这里测试用例为:sourcelist=[1,21,3,14,8,4,5,7]
有网友提出,最小数是负数,这样题目就很简单,不至于用10分钟,代码如下:
size=len(sourcelist)/2
sourcelist.sort()
print sum(sourcelist[:size])-sum(sourcelist[size:])
显然,这不是华为的本意(不过,题目也确实没讲清楚)
这里的最小数应该指的是大于等于0的数。这样题目就有意思多了,我没有在10分钟内写出来(连华为都···),事实上包括debug大概有接近2小时。主要是我开始的思路想错了。后来用笔算了算,才搞出思路~~代码如下:
def change(llist,rlist):
r=lenth-1
tflag=1
global flag
global cha
while r>=0 and tflag:
for l in range(lenth):
if((rlist[r]-llist[l])*2<=cha and rlist[r]>llist[l]):
rlist[r],llist[l]=llist[l],rlist[r]
rlist.sort()
llist.sort()
cha=sum(rlist)-sum(llist)
tflag=0
break
else:
r -=1
if(r<0):
flag=0
return (llist,rlist)
if(__name__=='__main__'):
sourcelist=[1,21,3,14,8,4,5,7]
sourcelist.sort()
lenth=len(sourcelist)/2
llist=sourcelist[:lenth]
rlist=sourcelist[lenth:]
cha=sum(rlist)-sum(llist)
flag=1
while flag:
(llist,rlist)=change(llist,rlist)
print llist,sum(llist)
print rlist,sum(rlist)
print cha