http://www.cnblogs.com/graphics/archive/2010/08/24/1761620.html
将文中题目用python(3.3.2)解决,重点学习思路。
1. 数组求和:
给定一个含有n个元素的整型数组a,求a中所有元素的和。
分析:基础思路,遍历相加。
若增加要求只用一行代码,可用递归的方法实现。
注意:python中的slice(a[ : ])不改变原array
def Sumup(a):
return 0 if len(a)==0 else Sumup(a[:len(a)-1]) + a[len(a)-1]
2. 求数组的最大值和最小值:
给定一个含有n个元素的整型数组a,找出其中的最大值和最小值。
分析:基础思路,遍历。其实python中的build in function包括max 和min,可以求数组的最大最小值。
这里用分治法(Divide and conquer),每次将数组分成左右两部分,求左右两边的(Max_l, Min_r 和 Max_r, Min_r),返回Max_l, Max_r中较大的, Min_r, Min_l中较小的。其中,求Max_l, Min_r 和 Max_r, Min_r需要递归引用MaxandMin函数。直到划分的左右两边各只有一个或两个元素。
def MaxandMin(a):
if len(a) == 0: #若数组为空
return(None, None)
if len(a) == 1: #若数组只有一个元素
Max = a[0]
Min = a[0]
return(Max, Min)
if len(a) == 2: #若数组只有两个元素
Max = a[0] if a[0] >= a[1] else a[1]
Min = a[0] if a[0] <= a[1] else a[1]
return(Max, Min)
else: #若数组多于两个元素
midnum = int(len(a) / 2) #等分数组
Max_l, Min_l = MaxandMin(a[:midnum]) #求左边数组的最大最小
Max_r, Min_r = MaxandMin(a[midnum:]) #求右边数组的最大最小
Max= Max_l if Max_l >= Max_r else Max_r
Min= Min_l if Min_l <= Min_r else Min_r
return(Max, Min)
3. 求数组的最大值和次大值
def MaxTwo(a):
if len(a) == 0:
return None, None
if len(a) == 1:
return a[0], a[0]
if len(a) == 2:
Max1 = a[0] if a[0] >= a[1] else a[1]
Max2 = a[0] if a[0] <= a[1] else a[1]
return Max1, Max2
else:
mid = int(len(a) / 2)
Max1_l, Max2_l = MaxTwo(a[:mid])
Max1_r, Max2_r = MaxTwo(a[mid:])
if Max1_l >= Max1_r:
Max1 = Max1_l
Max2 = Max2_l if Max2_l >= Max1_r else Max1_r
else:
Max1 = Max1_r
Max2 = Max2_r if Max2_r >= Max1_l else Max2_l
return Max1, Max2
4. 求数组中出现次数超过一半的元素
def find_half(a):
num = {}
for item in a:
num[item] = num.get(item, 0) + 1
if num[item] > len(a)/2:
return item
原文给了两个方法:第一个是先对数组排序,然后取中间元素即可,因为如果某个元素的个数超过一半,那么数组排序后该元素必定占据数组的中间位置。
1 如果a[i]==currentValue,则计数器值加1
2 如果a[i] != currentValue, 则计数器值减1,如果计数器值小于0,则更新当前值为a[i],并将计数器值重置为1”
def find_half(a):
currentValue = a[0]
count = 0 #start from 0
for item in a: #start from the first
if currentValue == a:
count += 1
else:
count -= 1
currentValue = item
print(item)
return item
5. 求数组中元素的最短距离
def minDistance(a):
a.sort()
tem1, tem2 = a[0], a[1]
for i in range(len(a) - 1):
if abs(a[i] - a[i+1]) < abs(tem1 - tem2):
tem1, tem2 = a[i], a[i+1]
print(tem1, tem2)
6. 求两个有序数组的共同元素
def findcommon(a, b):
i, j = 0, 0
res = []
while i < len(a) and j < len(b):
if a[i] > b[j]:
j += 1
elif a[i] < b[j]:
i += 1
else:
res.append(a[i])
i += 1
j += 1
print(res)
return(res)
注意:
for loop runs for fixed amount. while loop is used when a condition is to be met.