Just Do IT !

牛客网校招全国统一模拟笔试2020年2月场运维方向编程题解

字数统计: 890阅读时长: 3 min
2020/03/09 Share

1. 添加字符

题目描述:

牛牛手里有一个字符串A,羊羊的手里有一个字符串B,B的长度大于等于A,所以牛牛想把A串变得和B串一样长,这样羊羊就愿意和牛牛一起玩了。
而且A的长度增加到和B串一样长的时候,对应的每一位相等的越多,羊羊就越喜欢。比如”abc”和”abd”对应相等的位数为2,为前两位。
牛牛可以在A的开头或者结尾添加任意字符,使得长度和B一样。现在问牛牛对A串添加完字符之后,不相等的位数最少有多少位?

输入:
abe
cabc
输出:
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
str1 = input()
str2 = input()
len_str1 = len(str1)
len_str2 = len(str2)
ans = len_str1

if len_str1 < len_str2:
i = 0
while i+len_str1 <= len_str2:
cnt = 0
for j in range(len_str1):
if str1[j] != str2[i+j]:
cnt +=1
if cnt < ans:
ans = cnt
i += 1
else:
cnt = 0
for j in range(len_str1):
if str1[j] != str2[j]:
cnt += 1
if cnt < ans:
ans = cnt
print(ans)

2. 排序子序列

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。

牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列

牛牛想知道他最少可以把这个数组分为几段排序子序列

如样例所示:

牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

在这里插入图片描述

示例1:
输入
6
1 2 3 2 2 1
输出
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
n = input()
a = list(map(int, input().split()))

if n == 1 or n == 2:
print(1)

ans = 1
flag = 0 # 1增 0平 -1减
for i in range(1, len(a)):

if flag == 0:
if a[i - 1] < a[i]:
flag = 1
elif a[i - 1] > a[i]:
flag = -1
elif (flag < 0) == (a[i] > a[i - 1]):

ans += 1
flag = 0

print(ans)

组队竞赛

牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。

例如:

一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。

如样例所示:

如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.
输入描述:
输出描述:
示例1:

输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.
输出一个整数表示所有队伍的水平值总和最大值.
输入:
2
5 2 8 5 1 5
输出:
10
1
2
3
4
5
6
7
n = int(input())
list1 = list(map(int, input().split()))
list1 = sorted(list1, reverse=True)
ans = 0
for i in range(n):
ans += int(list1[2*i+1])
print(ans)
CATALOG
  1. 1. 1. 添加字符
  2. 2. 2. 排序子序列
  3. 3. 组队竞赛