用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”
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
- 用python实现一些数组的面试题
- python一些基础面试题
- 一些Python的面试题(无答案)
- 用位运算的一些面试题
- Python的面试题
- io流面试题简单实现的一些方法
- 程序员面试题精选100题(03)-求子数组的最大和—python实现
- java面试题:数组的常用算法实现
- 一些C#的面试题
- java的一些面试题
- C#的一些面试题
- C#的一些面试题
- Dotnet的一些面试题
- 搜集的一些面试题
- 一些面试题的解答
- 一些微软的面试题
- oracle 的一些面试题
- 一些Unity3D的面试题
- 原型模式
- 树状数组
- 【COGS1672】【SPOJ375】QTREE
- 浅谈分组背包
- Spring MVC 入门示例讲解 - howtodoinjava
- 用python实现一些数组的面试题
- 梦博——启程
- 悠闲的老鼠动画片,小鼠波波 Maisy教孩子学英语
- vmware安装linux无法全屏的解决方法
- hash函数_sumary
- bzoj 1036 树的统计
- 关于Ubuntu12.04安装
- URAL 1984. Dummy Guy(数学啊)
- C++输入输出流详解