2020-03-25 阿里笔试题

题目来源与大神题解地址:https://blog.csdn.net/m0_38065572/article/details/105101287
https://www.nowcoder.com/discuss/391530?type=all&order=time&pos=&page=1

第一题:

给定一个数组n,然后给三个长度为n的数组,可以从这三个数组中选出一个长度为n的数组,第i个位置需要是从给出的三个数组第i个位置选择的,然后要求使这个数组后一项减前一项的绝对值之和最小。
输入示例::
5
5 9 5 4 4
4 7 4 10 3
2 10 9 2 3
这里可以选择5 7 5 4 4,所以输出等于|7-5|+|5-7|+|4-5|+|4-4|=5。所以输出就是5。
————————————————
版权声明:本文为CSDN博主「August-us」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38065572/article/details/105101287

大神题解:
image.png

image.png
啰嗦预警:
  • 看了几位大神都是先把输入的矩阵转置然后再利用dp,为什么转置暂时不懂,可能这样遍历起来方便?如果不转置就得先遍历列,再遍历行。
  • 自己写的时候,把dp定义成二维数组了。但是可以注意到dp只与i-1的状态有关,所以优化成一维就可以
def fun1(nums,n):
    pre = [0] * 3
    nums = list(zip(nums[0],nums[1],nums[2])) #把输入矩阵做转置
    for i in range(1,n):
        cur = [0,0,0]
        for j in range(3):
            cur[j] = min (abs(nums[i][j] - nums[i-1][k]) +pre[k] for k in range(3))
        pre = cur
    return min(pre)

if __name__ == "__main__":
    n = int(input())
    nums = []
    for i in range(3):
         nums.append(list(map(int,input().split())))
    print(fun1(nums,n))

第二题:

给出一个二维矩阵,这个矩阵的每一行和每一列都是一个独立的等差数列,其中一些数据缺失了,现在需要推理隐藏但是可以被唯一确定的数字,然后对输入的查询进行回答。
输入描述:
第一行,n,m,q分别表示矩阵的行数,列数和查询的条数。
接下来的n行,每行m个数表示这个矩阵,0表示缺失数据。
接下来q行,每行两个数字i,j表示对矩阵中第i行第j列的数字进行查询。
输出描述:
如果可以确定该位置的数字,则输出数字,如果不能确定则输出UNKNOWN。
输入示例:
2 3 6
1 0 3
0 0 0
1 1
1 2
1 3
2 1
2 2
2 3
输出示例:
1
2
3
Unknown
Unknown
Unknown
————————————————
版权声明:本文为CSDN博主「August-us」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38065572/article/details/105101287

复习了一下等差数列:

大概思路是先对每行求公差,补每行;然后再对每列求公差,补每列。

大神代码(扫描行列思想)https://www.nowcoder.com/discuss/391530?type=all&order=time&pos=&page=1

解方程思想:https://www.nowcoder.com/discuss/392070?type=post&order=time&pos=&page=1

扫描行列思想,给大神代码加了注释:

def trans(A, n, m):  # n行,m列 的矩阵A
    # 把矩阵中为0的地方换成None #样例输入A= [[1,0,3], [0,0,0]] 变成[[1, None, 3], [None, None, None]]
    for i in range(n):
        for j in range(m):
            if A[i][j] == 0: A[i][j] = None
    #   求行的公差
    for i in range(n):
        has_num = set()  # 集合
        for j in range(m):
            if A[i][j] is not None:  # 元素不为None
                has_num.add((i, j))  # 把不为空元素的坐标添加进集合
            if len(has_num) == 2:
                # 某一行只要有了2个不为None的元素,该行所有元素都可以确定
                # list(has_num):[(0, 0), (0, 2)]
                pos1, pos2 = list(has_num)  # pos1为(0, 0)
                val1 = A[pos1[0]][pos1[1]]  # 读取该行第一个不为0的元素的值
                val2 = A[pos2[0]][pos2[1]]  # 读取该行第一个不为0的元素的值
                delta = (val2 - val1) // (pos2[1] - pos1[1])  # 求该行公差d
                for k in range(m):#补上能补的值
                    if A[i][k] is None:
                        A[i][k] = val1 + delta * (k - pos1[1])
    #   求列的公差
    for j in range(m):
        has_num = set()  # 集合
        for i in range(n):
            if A[i][j] is not None:  # 元素不为None
                has_num.add((i, j))  # 把不为空元素的坐标添加进集合
            if len(has_num) == 2:
                pos1, pos2 = list(has_num)  # pos1为(0, 0)
                val1 = A[pos1[0]][pos1[1]]  # 读取该列第一个不为0的元素的值
                val2 = A[pos2[0]][pos2[1]]  # 读取该列第2个不为0的元素的值
                delta = (val2 - val1) // (pos2[0] - pos1[0])  # 求该列的公差d
                for k in range(n):
                    if A[k][j] is None: #补上能补的值
                        A[k][j] = val1 + delta * (k - pos1[0])
if __name__ == "__main__":
    n,m,q = map(int,input().split())
    A = [] 
     for i in range(n):
          A.append(list(map(int,input().split())))
    trans(A, n, m)
    for j in range(q):  # 查询的条数
        x, y = map(int, input().split())
        x -=1
        y -=1
        if A[x][y] :
            print(A[x][y])
        else:
            print('Unknown')
但是!扫描行列可能不能解决这种矩阵:

0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
所以又有大神给出了四元方程可解的思想:https://www.nowcoder.com/discuss/392070?type=post&order=time&pos=&page=1
(先让我看懂,py代码后续更)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容