20220829 阿里巴巴 开发岗笔试题

第一题:打印“里”字
题目:输入“里”字的大小n,输出n倍大小的“里”字
思路:
  • 首先,根据给的模板,二维数组保存1倍大小的“里”字;
  • 每列的元素复制n份;(如n=3,‘--*--’变成‘------***------’)
  • 每行往下复制n份;
  • 就变成了n倍大小的“里”字了。

第二题:消消乐

题目:有个二维数组,保存4种颜色:r,b,g,p,对应4种分数:1,2,3,5。邻近的同色可以消除(上下左右),并获得消除掉的分数。小红可以点击k个块,问小红能获得得最高分数?

思路

  • 将r,b,g,p转成分数数组,然后dfs计算每个块的分数;(题目岛屿数量的思路)
  • 求和topk的分数;
示例:
输入:

3 3 3 (表示行,列,k)

rbr

rrp

bgg

输出:14
def cal_score(arr, mask, num, i, j, score):
    if i < 0 or j < 0 or i >= len(arr) or j >= len(arr[0]):  # 判断越界
        return score
    if arr[i][j] != num or mask[i][j] == 1:  # 不属于同种颜色的 or 已经遍历过的
        return score
    if mask[i][j] == 0:  # 没遍历过
        mask[i][j] = 1
        score += arr[i][j]
    score = cal_score(arr, mask, num, i + 1, j, score)
    score = cal_score(arr, mask, num, i, j + 1, score)
    score = cal_score(arr, mask, num, i - 1, j, score)
    score = cal_score(arr, mask, num, i, j - 1, score)
    return score


data = list(map(int, input().split()))  # 获取n m k
n = data[0]
m = data[1]
k = data[2]

arr = []
for i in range(n):  # 保存对应的分数数组
    line = []
    for c in input():
        if c == 'r':
            line.append(1)
        elif c == 'b':
            line.append(2)
        elif c == 'g':
            line.append(3)
        elif c == 'p':
            line.append(5)
    arr.append(line)

mask = []
for i in range(n):  # 生成mask数组
    l = [0 for j in range(m)]
    mask.append(l)

res = []
for i in range(n):  # 计算每个点的消消乐分数
    for j in range(m):
        # 初始分数为0,如果arr[i][j]已经遍历过,返回0
        res.append(cal_score(arr, mask, arr[i][j], i, j, 0))

res.sort(reverse=True)  # 求和top k值
print(sum(res[:k]))

第三题:2022的倍数

题目:两个数组各选一个数,乘积是2022倍数,问有多少种组合?提示,2022=2*3*337

思路1:暴力判断所有的组合是否是2022的倍数,超时。因为每个数参与了多次计算。

思路2:2022的倍数=2的倍数*3的倍数*337的倍数,保证2、3、337的倍数各有一个,那么一定是2022的倍数。

  • 一个数是2、3、337的倍数,可以表示为1,10,100;
  • 将一个数分成8类:0,1,10,100,11,101,110,111;
  • 两个数的类别相加,只要大于等于111,那么这个数一定是2022的倍数;(因为保证了2、3、337的倍数各有一个)

思路2与思路1相比:

  • 思路2是,每个数求余3次,可以确定数的类别,然后就可以统计各个类别的组合数,时间O(n+m);
  • 思路1是,两两数的组合求余1次,统计组合数,时间O(n*m);
  • 巧妙将原问题转成组合问题;
代码
谢谢博主的分享!

#阿里笔试##阿里巴巴笔试#
全部评论
能音频阿里巴巴的都是大神
点赞 回复 分享
发布于 2022-08-31 10:35 江苏

相关推荐

#牛客在线求职答疑中心#&nbsp;该游戏是一个8*8的方格矩阵,每个方格有一种颜色:红色、蓝色或绿色。小红每次可以选择一个方格,将该方格和连通块上所有和该方格颜色相同的方格一起消除。之后小红可以选择一个下落方向(上、下、左或者右),使矩阵中所有方格朝着一个方向下落,把空隙填补上对于一局游戏而言,将要填补的方格颜色是预置好了的。也就是说,当小红做出一个操作、消除了方格之后,将要填补的方格是已知的。举个例子,对于一个3*3的矩阵而言,假设待填补的颜色是三行字符串:rbbbgrgrbrrrbg......&nbsp;brgbbgrgrbbbbr......&nbsp;rbgbgrbgrgrggr......&nbsp;初始矩阵是:&nbsp;bbr&nbsp;gbb&nbsp;brg&nbsp;小红初始选择了(2,2)坐标。若小红选择向上落,那么矩阵变成:&nbsp;grr&nbsp;b*g&nbsp;***&nbsp;其中*代表空格。之后第一个字符串的第一个字符填补进第一列,第二个字符串的前两个字符依次填补进第二列,第三个字符串的第一个字符填补进第三列。然后矩阵变成:&nbsp;grr&nbsp;bbg&nbsp;rrr&nbsp;待填补的三个字符串变成:&nbsp;bbbgrgrbrrrbg......&nbsp;gbbgrgrbbbbr......&nbsp;bgbgrbgrgrggr.....&nbsp;至此第一次操作完毕。对于一个8*8的矩阵,共有8个待填补字符串。向上落、向下落的话,八个字符串依次填补第一列、第二列..第八列。向左落、向右落的话,八个字符串依次填补第一行、第二行....第八行。小红给出了每次操作的坐标和下落方向,她想知道每次操作可以消除多少方格?&nbsp;输入描述第一行输入一个正整数&nbsp;几,代表小红的操作次数。接下来的8行,每行输入一个长度为8的字符串,代表消消乐游戏的初始棋盘接下来的8行,每行输入一个长度为8*几的字符串,代表8个待填补字符串。接下来的n&nbsp;行,每行输入两个正整数&nbsp;心,¼和一个字符&nbsp;0p,代表小红选择的坐标(Ii,y)和下落方向op。请注意,坐标是从1开始到8,并非从0开始到7。数据范围:&nbsp;1&nbsp;≤n≤&nbsp;10000,1&nbsp;≤xi,yi=&amp;lt;8所有表示格子的字符一定是'r'、’g’、'b'三个中的一个,分别表示红色、绿色和和蓝色。&nbsp;op&nbsp;一定是'w'、'a'、's'、'd'四种字符中的一个,分别代表向上落、向左落、向下落、向右落。输出描述输出&nbsp;几&nbsp;行正整数,每行代表每次操作的消除总数量。
点赞 评论 收藏
分享
评论
6
18
分享
牛客网
牛客企业服务