+ -
当前位置:首页 → 问答吧 → 求随机数列字串最大和问题Python解法

求随机数列字串最大和问题Python解法

时间:2010-10-23

来源:互联网

最近有道面试题很流行:
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a+a[i+1]+…+a[j]的子段和的最大值

贴个Python解法:
  1. #!/usr/bin/python
  2. import sys
  3. def getMax(array):
  4.   maxV=None;
  5.   maxL=[]
  6.   start = 0
  7.   end = 0
  8.   for n in range(len(array)):
  9.     l=[]
  10.     v=0
  11.     for i in array[n:]:
  12.       l=l[:]
  13.       l.append(i)
  14.       v=v+i
  15.       if(v>maxV or maxV==None):
  16.         maxV=v
  17.         maxL=l
  18.         start = n
  19.         end = n+array[n:].index(i)
  20.   
  21.   print("Start: %s, End: %s" % (start, end))
  22.   print(maxV)

  23. def getMax2(array):
  24.   tempSum = None
  25.   Sum = None
  26.   start = 0
  27.   end = 0
  28.   tempStart = 0
  29.   for n in range(len(array)):
  30.     if tempSum>0 or tempSum>array[n]:
  31.       tempSum = tempSum+array[n]
  32.     else:
  33.       tempSum = array[n]
  34.       tempStart = n
  35.    
  36.     if tempSum>Sum:
  37.       start = tempStart
  38.       Sum=tempSum
  39.       end = n

  40.   #print(array[start:end+1])
  41.   print("Start: %s, End: %s" % (start, end))
  42.   print(Sum)

  43. if __name__=="__main__":
  44.   getMax([int(x) for x in sys.argv[1].split(",")])
  45.                                                                                                                         
复制代码
getMax是最简单直观的两层循环穷举
getMax2是动态规划算法:

再来个测试脚本:
  1. #!/usr/bin/python

  2. import random
  3. import sys
  4. import time
  5. from getMax import *

  6. def getRandomList(num):
  7.   if not num:
  8.    length = random.randint(1,1000)
  9.   else:
  10.    length = num

  11.   l=[]
  12.   for i in range(length):
  13.     l.append(random.randint(-1000000,1000000))

  14.   return l


  15. if __name__=="__main__":
  16.   for i in range(10):
  17.     l = getRandomList(None)
  18.     print("")
  19.     print("********")
  20.     print("Length of test data: %s" % len(l))
  21.     print("Method: getMax")
  22.     start=time.time()
  23.     getMax(l)
  24.     print("Used time: %s" % (time.time()-start))
  25.     print("")
  26.     print("Method: getMax2")
  27.     start=time.time()
  28.     getMax2(l)
  29.     print("Used time: %s" % (time.time()-start))
  30. ~                                                   
复制代码
初学Python,code style就那样儿,估计说的还不是地道的Python方言

作者: donotblock   发布时间: 2010-10-23

不错呵,初学能写出这些代码

作者: a515200a   发布时间: 2010-10-24