轩辕互动的python面试题(转)

来源:互联网 发布:济南康健网络 编辑:程序博客网 时间:2024/04/28 21:28

 今天在javaeye看到两个问题,据说是轩辕互动的python面试题,其中一个是"平衡点问题",另一个是"支配点问题",

地址是http://www.javaeye.com/topic/600079
其中两个问题的描述如下:
1.平衡点问题 
平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的

部分,那么这个点的位序就是平衡点 
要求:返回任何一个平衡点

2.支配点问题: 
支配数:数组中某个元素出现的次数大于数组总数的一半时就成为支配数,其所在位序成为支配点;比如int[] a = {3,3,1,2,3};3为支配数,0,1,4分别为支配点; 
要求:返回任何一个支配点 
本问题可归结为众数问题(统计学范畴),即一组数据中出现次数最多的那个数值,它可以没有也可以为多个。

我思考了一下,平衡点问题可以这么做:
使用sum函数累加所有的数。
使用一个变量fore来累加序列的前部。直到满足条件fore<(total-number)/2;
python代码如下:

numbers = [1,3,5,7,8,2,4,20]

#find total
total=sum(numbers)

#find num
fore=0
for number in numbers:
   if fore<(total-number)/2 :
      fore+=number
   else:
      break

#print answer
if fore == (total-number)/2 :
   print number
else :
   print r'not found'

算法简单,而且是O(n)的,12行代码搞定,不需要他们说的那么多那么麻烦。

而第二个问题,《编程之美》里有答案。就是寻找水王那篇。

具体方法是:将序列排序,取中位数——注意,如果一个大于整体的一半,那么排序之后支配数一定在中间。(原因请参考《编程之美》)

然后验证是否正确。(因为题目说了,可能会不存在)

numbers = [1,3,4,3,3] 
#calculate
numbers.sort()
lens=len(numbers)
candidate=numbers[lens/2]

#validate
N=0
for number in numbers:
    if number==candidate:
       N+=1

#print answer
if (N>=lens/2):
     print numbers[lens/2]
else :
   print 'not found'

结语:其实都不难,用python写起来都是超级短的程序。算法取决于排序,13行代码。

PS:编程之美中《寻找水王》中有更好的解决方法。

原贴地址:http://hi.baidu.com/ruclin/blog/item/b8ed51d6f55441d0a044df38.html

延伸阅读:

《编程之美》豆瓣
《编程之美》互动网
《编程之美》,IT人求职面试必读

原创粉丝点击