华为面试题解

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

                      


 

转载于:https://www.cnblogs.com/zhangsan/archive/2010/06/28/1767000.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值