码迷,mamicode.com
首页 > 其他好文 > 详细

京东2019暑期实习生在线笔试(原创)

时间:2019-04-14 20:41:49      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:应该   京东   不用   append   com   包含   空间复杂度   现在   处理   

第一题:

题目描述:
现有红绿两种颜色的石头,现在我们需要用这两种石头搭建一个塔,塔需要满足如下三个条件:
1,第一层应该包含1块石头,第二层应该包含两块,第i块需要包含i块石头;
2,同一层的石头应该是同一个颜色(红或绿);
3,塔的层数尽可能多。
问在满足上述三个条件的前提下,有多少种不同的建造塔的方案,
当塔中任意一个对应位置的石头颜色不同,我们就认为这两个方案不相同。石头可以不用完。

输入:输入仅包含两个正整数,分别表示红和绿砖块的数量a,b(0<=a,b<=2*10**5,a+b>=1)
输出:输出和仅包含一个正整数,表示不同的方案数对10**7取模的结果。

输入样例1:4 6
输出样例1:2

输入样例2:20 122
输出样例2:192

处理程序:
缺点:时间复杂度高、空间复杂度高。需要后续进行优化

 1 # *** 辅助函数 *** #
 2 def select_index(COUNTER, i, num):
 3     line0 = list(range(1, COUNTER + 1))
 4     line1 = list(combinations(line0, i))
 5     line2 = []
 6     for j in line1:
 7         data = [x for x in j]
 8         if sum(data) == num:
 9             line2.append(data)
10     return line2
11 
12 
13 def select_sub(line0, DIF):
14     for i in range(1, len(line0) + 1):
15         line1 = list(combinations(line0, i))
16         line2 = []
17         for j in line1:
18             data = [x for x in j]
19             if sum(data) <= DIF:
20                 line2.append(data)
21         return line2
22 
23 
24 # *** 数据输入 *** #
25 d0 = list(map(int, input().split()))
26 MIN, MAX, SUM = min(d0), max(d0), sum(d0)
27 COUNTER, SUM_TOWER = 0, 0
28 while True:
29     COUNTER += 1
30     SUM_TOWER += COUNTER
31     if SUM_TOWER > SUM:
32         SUM_TOWER -= COUNTER
33         COUNTER -= 1
34         break
35 DIF = SUM - SUM_TOWER
36 
37 # *** 数据处理 *** #
38 d1 = []  # 最小个数的个数
39 for i in range(1, COUNTER + 1):
40     d_mid = select_index(COUNTER, i, MIN)
41     d1.extend(d_mid)
42 # print(d1)
43 
44 d2 = []
45 for line0 in d1:
46     d_mid = select_sub(line0, DIF)
47     d2.extend(d_mid)
48 # print(d2)
49 
50 # *** 数据输出 *** #
51 if MIN == 0 and MAX == 0:
52     print(0)
53 elif MIN == 0 and MAX > 0:
54     print(1)
55 else:
56     print((len(d1) + len(d2)) % 10**7)

 

第二题:

题目描述:
拉齐有01序列,他可以对这个序列进行任意多次变换,每次变换都是把序列的最后若干个元素放到最前面,
例如:01001,将最后3个元素011放到最前面,序列变为011010。
所有变换结束后,拉齐需要挑选出一个全为1的连续区间,要求最大化区间长度。

输入:共一行,一个01串,仅包含0或1.序列长度不超过50000。
输出:一个整数,表示最长区间的长度。

输入样例1:11011
输出样例1:4

输入样例2:11111
输出样例2:5

输入样例3:000000000000
输出样例3:0

输入样例4:1
输出样例4:1

输入样例5:0
输出样例5:0

 1 while True:
 2     try:
 3         LIST = input()
 4         if 0 in LIST:
 5             index_ones = LIST.index(0)
 6             index_now = index_ones
 7             max = index_now
 8 
 9             while True:
10                 if 1 not in LIST[index_now:]:
11                     break
12 
13                 index_start = LIST[index_now:].index(1)
14                 index_now += index_start
15 
16                 if 0 not in LIST[index_now:]:     # 后面全部是1并且结尾
17                     if max < (index_ones + len(LIST) - index_now):
18                         max = (index_ones + len(LIST) - index_now)
19                     break
20 
21                 index_end = LIST[index_now:].index(0)
22                 index_now += index_end
23                 if max < index_end:
24                     max = index_end
25 
26             print(max)
27 
28         else:
29             print(len(LIST))
30 
31     except:
32         break

 

京东2019暑期实习生在线笔试(原创)

标签:应该   京东   不用   append   com   包含   空间复杂度   现在   处理   

原文地址:https://www.cnblogs.com/Mufasa/p/10706803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!