快手 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% 就交卷取快递去了。代码太丑就不献上了(