bilibili校招算法笔试题 (2019年8月20日

第一题 把数字翻译成字符串

leetcode 91题原题,动态规划
从1开始表示字母,这会导致0无法单独存在表示为一个字符,前面必须要是1或者2。

范围为‘1’ ~ ‘26’

  • 如果当前位为0:
    • 如果前一位不是1或2,则这个0无法和任何数组成字母,代表整个串无法构成编码,直接返回0
    • 如果前一位是1或者2,则说明前一位和当前位能组成字母,这时候能构成的编码数目是和 i-2 位相同的,即:dp[i] = dp[i-2]
  • 如果当前位不为0:
    • 如果前一位和当前位能组成字母,则当前位的构成编码数目应该为前一位和前前位之和,即:dp[i] = dp[i-1] + dp[i-2]
    • 如果前一位和当前位不能组成字母,则当前位单独组成字母,即dp[i] = dp[i-1]

还要注意0不能是字符串的开头!

if not s or s[0] == '0':
    return 0
n = len(s)
f = [0] * (n + 1)
f[0], f[1] = 1, 1
for i in range(2, len(s)+1):
    if s[i-1] == '0':
        if s[i-2] in {'1', '2'}:
            f[i] = f[i - 2]
        else:
            return 0
    else:
        if '10' <= s[i - 2:i] <= '26':
            f[i] = f[i - 1] + f[i - 2]
        else:
            f[i] = f[i - 1]
return f[n]

第二题 python实现卷积运算

暴力求解

h, w = list(map(int, input().split()))
image = []
kernel = []
for _ in range(h):
    image.append(list(map(int, input().split())))
m = int(input())  # 卷积核大小
for _ in range(m):
    kernel.append(list(map(float, input().split())))
out = [[0] * (w - m + 1) for _ in range(h - m + 1)]
# 卷积运算
for row in range(h - m + 1):
    for col in range(w - m + 1):
        cnt = 0
        for i in range(m):
            for j in range(m):
                cnt += image[row + i][col + j] * kernel[i][j]
        out[row][col] = int(max(0, min(cnt, 255)))
# 输出结果
for i in range(len(out)):
    for j in range(len(out)):
        print(out[i][j], end=' ')
    print()

第三题 翻转字符串中长度为奇数的单词

s = list(input().split())
res = []
for word in s:
if len(word) & 1:
	res.append(word[::-1])
else:
	res.append(word)
print(" ".join(res))

你可能感兴趣的:(编程题)