阿里巴巴-2020秋招-数据研发工程师
虽然是昨晚才做的笔试,现在也就大概记得笔试题目,就说个大概题意。
总体感觉笔试的选择题有些难度比较大,编程题的难度是《剑指》的一般水准。
题意:给定N*M的地图(1或者0),如果2*2区域的点均为1,可以设置一个运营区域,运营区域不互相覆盖,问最多可以设置多少个运营区域。
思路:按照地图自左往右 [ : -1]、自上而下 [ : -1],逐步看目前点已经对应的右边、下边、右下边是否为1,为1即可设置运营区域。 按照这种顺序进行扫描,能确保不会影响到我们对问题的求解。挺简单的,AC。
# -*- coding: UTF-8 -*-
sam = [] # 地图
result = 0 # 输出结果
def Toint(lis):
for i in range(len(lis)):
lis[i]=int(lis[i])
# 查看该点是否符合条件
def que(x,y):
global result
if sam[x][y]==1 and sam[x+1][y] == 1 and sam[x][y+1] == 1 and sam[x+1][y+1] == 1:
# 已经建立的把 1 变为 2
sam[x][y] = 2
sam[x+1][y] = 2
sam[x][y+1] = 2
sam[x+1][y+1] = 2
result+=1
return
N = input()
M = input()
data = raw_input()
data = data.split(' ')
num=0
# 构建地图矩阵
for i in range(N):
h = []
for j in range(M):
h.append(int(data[num]))
num+=1
sam.append(h)
# 驻点遍历
for i in range(N-1):
for j in range(M-1):
que(i,j)
# 输出最终的地图
# for i in sam:
# print(i)
print(result)
'''
输入:
3
3
1 1 1 1 1 1 1 0 1
输出:
1
'''
题意:有两张满M可用的优惠券,现在给你N件商品,让你用最少的钱花出去两张优惠券,输出花费的最少钱。如果无法使用就输出‘-1.0’
思路:首先,无法将两张优惠券一起使用的条件是N件商品的总价低于2*M,所以,只要写个简单判断,就能拿20%了。然后为什么一开始说阿里这次的难度稍低一些呢,一开始不知道怎么写,就想着速度码个深搜看看能不能先混点分,毕竟这么做在其他题目上这么做正常都是拿60%,太慢。但....丢上去就AC了。
# -*- coding: UTF-8 -*-
def Toint(lis):
for i in range(len(lis)):
lis[i]=int(lis[i])
min_lis = [] # 第一次选择优惠的商品
min_qian = 0 # 第一次选择优惠的商品的总价格
res_lis = [] # (结果)第二次选择优惠的商品
res_qian = 0 # (结果)第二次选择优惠的商品的总价格(最低)
# 第二次进行商品选择
def key2(data,M,now_value,now_index,now_lis,leng):
global res_lis, res_qian
# 商品价值大于M,可以停止
if now_value >= M:
if now_value + min_qian < res_qian:
res_qian=now_value+min_qian
res_lis = now_lis+min_lis
return
# 数据长度大于leng,可以停止
if now_index>=leng:
return
# 选择该商品
key2(data, M, now_value + data[now_index], now_index + 1, now_lis + [data[now_index]],leng)
# 不选择该商品
key2(data, M, now_value, now_index + 1, now_lis,leng)
# 第一次进行商品选择
def key(data,M,now_value,now_index,now_lis,leng):
global min_qian,min_lis,res_lis,res_qian
if now_value >= M:
# 符合条件,去除目前所选择的商品,剩余的商品进入第二次选择
data2=[]
data2.extend(data)
for i in now_lis:
data2[i]=0
min_lis = now_lis
min_qian = now_value
key2(data2,M,0,0,[],leng)
return
# 数据长度大于leng,可以停止
if now_index>=leng:
return
# 选择该商品
key(data, M, now_value + data[now_index], now_index + 1, now_lis + [now_index],leng)
# 不选择该商品
key(data, M, now_value, now_index + 1, now_lis,leng)
M = input()
data = raw_input()
data = data.split(' ')
Toint(data)
data.sort()
# 商品总值小于2张优惠卷,无法符合条件
if sum(data)<2*M:
print(-1.0)
else:
# 随便设置一个比较大的值
min_qian = 2*M
res_qian = 2*M
# 适当剪枝的深度搜索
key(data,M,0,0,[],len(data))
print('%.1f'%(res_qian))
'''
输入:
300
200 50 50 251 251
输出:
602.0
'''