万万没想到研二下学期要为当程序员做准备——在线编程笔试题篇

 1 '''
 2 Created on 2016年4月1日
 3 
 4 @author: betterSN
 5 
 6 蘑菇街2016实习生招聘大数据工程师笔试题:给定9个数字,分别代表书写1-9的每个数字需要用的墨水量,并且给出总墨水量,请求出能书写出的最大数字为多少
 7 即 输入:总墨水两vol
 8         书写1-9分别用的墨水两(a1,a2,...,a9)
 9   输出:得到的最大数字
10 例如:输入vol=5,  (a1,a2,...,a9) = (5,4,3,2,1,2,3,4,5) 输出 55555
11      输入vol=5,  (a1,a2,...,a9) = (5,4,3,2,2,2,3,4,5) 输出 76             
12 '''
13 from _functools import reduce
14 
15 '''
16 输入(a1,a2,...,a9)得到按照墨水量排序的(a,v)的组合形成的list
17 '''
18 def voldata_sorted(n,input):
19     dict = {}
20     
21     for i in range(n):
22         dict[i+1] = input[i]
23     dict_sort = sorted(dict.items(),key = lambda d: d[1])
24     print("dict_sort:")
25     print(dict_sort)
26     return dict_sort
27 '''
28 输入list,每个元素是整数,得到由大到小的排序
29 '''
30 def buildmax(input):
31     input_sort = sorted(input, reverse = True)
32     return input_sort
33 
34 '''
35 得到最终答案的备选,即墨水量的总和为vol,并且局部最大
36 例如(a1,a2,...,a9) = (5,4,3,2,1,2,3,4,5)的情况下
37 [[5, 5, 5, 5, 5], [4, 4, 5], [6, 6, 5], [3, 6], [7, 6], [2, 5], [8, 5], [1], [9]] 
38 '''
39 def getcandidatelovenumber(vol,n,input):
40     data_list = voldata_sorted(n, input)
41     #print("data_list:")
42     #print(data_list)
43     candidates = []
44     i = 0
45     for (k,v) in data_list:
46         can = []
47         vol_re = vol
48         while(vol_re>0):
49             key = findkey(vol_re, data_list[0:i+1])
50             #print(vol,key)
51             if key > 0:
52                 can.append(key)
53             else:
54                 break
55             vol_re = vol_re-v    
56         candidates.append(can) 
57         i = i+1
58     print(candidates)    
59     return candidates
60   
61 '''
62 找出data_list中最靠近max的最大的k,data_list中每个元素的形式为(k,v)
63 '''
64 def findkey(max, data_list):
65     result = -1
66     for (k,v) in data_list:
67         if v<=max:
68             result = k
69     return result
70 
71 
72 def f1(x,y):
73     return x*10 + y
74 
75 def getlovenumber(n,data): 
76     l = list(map(buildmax,getcandidatelovenumber(n,9,data))) # 得到每个备选的最大数字排序
77     candidata_numbers = []
78     # 将排序的list转化为数字
79     for item in l:
80         num = reduce(f1,item)
81         candidata_numbers.append(num)
82         # 找出备选中最大的数字
83     return max(candidata_numbers)
84     
85 def main():
86     vol = input("请输入墨水总量\n")
87     str = input("请输入a1-a9,用空格隔开\n").split()
88     data = []
89     for item in str:
90         data.append(int(item))
91     getlovenumber(vol, data)
92 
93 if __name__ == '__main__': 
94     print(getlovenumber(5, [5,4,3,2,2,2,3,4,5]))
95 
96 
97  

背景是这样的,留给自己看:

由于今年工作不好找,大家都走上了人人都当程序员的道路。(本来不是人人都是产品经理嘛?? p.s. 这是2016年春)

本人可以说对编程从来没有系统学过,都是写论文做实验的时候需要用什么就现学的那种,只在本科上课的课堂上了解过编程的基本思想

以前只写过java,把编程当作是一种辅助研究的工具看待,但也不能否认用代码解决问题时还是有一定成就感滴。

目前打算向数据挖掘(甚至大数据)方向发展,对,是职业发展,故把一切抛开重新来过,几乎零基础学起

这次是开始学习python的时候发现python的确比Java方便,所以打算把人生第一次的技术岗笔试用python写一下。

(真相是:作为一个怎么看都不是程序员的我,笔试的时候当然连选择题的题目都看不懂!!!so, just keop moving!)

posted @ 2016-04-01 14:19  betterSN  阅读(597)  评论(1编辑  收藏  举报