代码改变世界

华为面试题解

2010-06-28 21:02  张三~  阅读(1801)  评论(13编辑  收藏  举报

谢谢网友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