2022阿里4.22算法笔试题
1.
单选和多选都是六道,具体题目忘记了,大部分都是概率论知识
2.
贪吃蛇:
n行m列地图,从某个位置出发,怎么走由WSAD组成(就是对应上下左右),遇到$就吃掉,*表示蛇,.表示空地,很简单,就是需要一个数组来定义食物有没有被吃,防止重复计算
代码:
AC100%
nm = list(map(int, input().split()))
n, m = nm[0], nm[1]
map = []
start = 0
for i in range(n):
temp = list(''.join(input()))
if '*' in temp:
start = [i, temp.index('*')]
map.append(temp)
path = list(''.join(input()))
hashmap = {'W': [-1, 0], 'S': [1, 0], 'D':[0, 1], 'A':[0, -1]}
res = 0
flag = [[False]*m for _ in range(n)]
for p in path:
if 0 <= hashmap[p][0] + start[0] < n and 0 <= hashmap[p][1] + start[1] < m:
start[0] = hashmap[p][0] + start[0]
start[1] = hashmap[p][1] + start[1]
if map[start[0]][start[1]] == '$' and flag[start[0]][start[1]] == False:
flag[start[0]][start[1]] == True
res += 1
print(res)
3.
关于日期的题目,时间不够了,难受,题目判断条件多(比如2月不超过28天,年份不超过2022-9999),但是简单,细心一点可以AK的,具体内容忘记了
4.
给定数组,最少删除多少数字,可以让数组保持严格递增:
思路:
找到最长递增序列,删除他的长度就可以
代码:
AC20%
n = int(input())
a = list(map(int, input().split()))
dif = [0]*(n-1)
for i in range(1, n, 1):
dif[i-1] = a[i] - a[i-1]
print(dif)
maxres = 0
res = 0
for i in range(len(dif)):
if dif[i] > 0:
maxres += 1
res = max(maxres, res)
elif dif[i] == 0:
res -= 1
else:
maxres = 0
print(n - res - 1)
优化:
最长严格递增可能不连续,,这是自己在上面没有注意到的点,所以使用temp来存储递增最后一位,对于新的一位进行判断
自己感觉问题在这里,已经无法验证了
n = int(input())
a = list(map(int, input().split()))
dif = [0]*(n-1)
for i in range(1, n, 1):
dif[i-1] = a[i] - a[i-1]
print(dif)
maxres = 0
res = 0
temp = [0]
for i in range(len(dif)):
if dif[i] > 0:
if a[i+1] > temp[-1]:
temp.append(a[i+1])
maxres += 1
else:
maxres = 0
res = max(maxres, res)
elif dif[i] == 0:
res -= 1
else:
maxres = 0
print(n - res - 1)