快手 4.12 工程类笔试B卷
一共四道编程,说实话感觉难度不是很难。
#1 对于输入的任意一个表达式,输出其小括号匹配的次数以及未匹配的左右括号的个数。
例如:
输入:(1 + 2)()))(
输出为: 2 1 2
对于这一题,显然弄一个栈即可。
AC 代码如下:
s = input()
stack = []
pair = 0
l = 0
r = 0
for i in s:
if i == '(':
stack.append(i)
elif i == ')':
if len(stack) > 0 and stack[-1] == '(':
pair += 1
stack.pop()
else:
stack.append(i)
for i in stack:
if i == '(':
l += 1
else:
r += 1
print('%d %d %d' % (pair, l, r)) #2 GetPowerFactor 贪心即可。
对于给定 r n,判断 r 是否能仅由 n 的 i 次幂之和组成。如果可以,输出 i 的列表(其中每个 i 只能用一次)。
例如:
get(39, 3) == [1,2,3]
get(33,3) == []
get(1,3) == [0]
AC 代码如下:
!!注意第二题开始输入输出方式类似 LeetCode,楼主因为要在本地调试的原因没有同在线提交的格式完全一致。
def get(r, n): radix = [] base = 1 result = [] while base <= r: radix.append(base) base *= n for i in reversed(range(len(radix))): if r >= radix[i]: r -= radix[i] result.append(i) if r == 0: return list(reversed(result)) else: return []#3 假定有 N 个顾客,每个顾客具有两个属性 a 和 b。每个顾客的不满意度可以表示为(a * (该顾客前面的人的个数) + b * (该顾客后面的人的个数))。
例如,有三个顾客,其属性(a,b) 分别为 (1,3), (4,5), (9,5),排列为 [1,2,3]。则顾客 2 的不满意度为 4 * 1 + 5 * 1 = 9。
对于一组顾客,给出使得总不满意度最小的排列。
例如:
a = [8,9,7]
b = [6,8,3]
排序结果为 [3,1,2]
对顾客按照 b[i] - a[i] 排序就好了。
AC 代码如下:
def userSort(a , b): gen = [] for i in range(len(a)): gen.append([b[i] - a[i], i]) gen.sort(key=lambda x: x[0]) result = [] for i in gen: result.append(i[1] + 1) return result
#4
给定一字符矩阵,其中标为 '*' 的地方不能坐人,标为 '.' 的地方能做人。因为疫情影响,要求每个人相邻的位置不能有人。求这一矩阵最多能坐下多少人。
例如,对
[['*', '.', '*', '*', '.'],
['*', '.', '*', '*', '*'],
['*', '.', '*', '*', '.']]
最多能坐 4 个人。
这题应该事 DFS,但是楼主只砍了 80% 就交卷取快递去了。代码太丑就不献上了(

