用python实现一些数组的面试题

来源:互联网 发布:淘宝卖家工具 编辑:程序博客网 时间:2024/06/02 05:09

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. 求数组的最大值和次大值

给定一个含有n个元素的整型数组,求其最大值和次大值。
分析:类似上一题,分治法
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. 求数组中出现次数超过一半的元素

给定一个n个整型元素的数组a,其中有一个元素出现次数超过n / 2,求这个元素。
分析:我的方法是将所有元素依次与dictionary的key比较,已有则value加1,没有则存入,value为1。当value大于n/2了,返回。
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]
1 如果a[i]==currentValue,则计数器值加1
2 如果a[i] != currentValue, 则计数器值减1,如果计数器值小于0,则更新当前值为a[i],并将计数器值重置为1”
其思路是将数组看成a(目标元素)和非a。利用a比非a多的特点。其优点是节省空间。具体是否覆盖所有情况,不是很清楚,留待以后琢磨,怎么证明这种方法的完备性
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. 求数组中元素的最短距离

定一个含有n个元素的整型数组,找出数组中的两个元素x和y使得abs(x - y)值最小。
分析:先对数组排序,然后遍历一次即可。
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. 求两个有序数组的共同元素

给定两个含有n个元素的有序(非降序)整型数组a和b,求出其共同元素。
例:a = 0, 1, 2, 3, 4 
b = 1, 3, 5, 7, 9
输出 1, 3
分析:两指针指向数组第一个元素,向后移动。
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.

















0 0