鱼C论坛

 找回密码
 立即注册
查看: 1920|回复: 57

[已解决]Python:每日一题 356

[复制链接]
发表于 2020-3-21 20:11:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-3-22 17:39 编辑

今天的题目:


如果一个矩阵的每一方向由左下到右上的对角线上元素是相同的,那么这个矩阵被叫做完美矩阵。

给定一个 M × N 的矩阵,当它是完美矩阵时返回 True。

示例 1:

输入:
[
  [1, 2, 3, 4],
  [5, 1, 2, 3],
  [9, 5, 1, 2]
]
输出:True
解释:
在上述矩阵中, 其对角线为:
"[9]"、"[5, 5]"、"[1, 1, 1]"、"[2, 2, 2]"、"[3, 3]"、"[4]"。
各条对角线上的所有元素均相同,因此答案是 True。
示例 2:

输入:
[
  [1, 2],
  [2, 2]
]
输出:False
解释:对角线 "[1, 2]" 上的元素不同。


欢迎大家一起答题!
最佳答案
2020-3-22 16:14:11
尝试一行代码
  1. def f356(x):
  2.     return sum([x[i][:-1]!=x[i+1][1:] for i in range(len(x)-1)])==0 if len(x)>1 else True if len(x)==1 and len(x[0])!=0 else False
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-21 20:18:44 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-21 20:28 编辑
  1. class Solution:
  2.     def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:
  3.         matrix=matrix.__iter__()
  4.         last=matrix.__next__()
  5.         for row in matrix:
  6.             if row[1:]!=last[:-1]:
  7.                 return False
  8.             last=row
  9.         return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-21 20:22:58 | 显示全部楼层
小白,路过学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 20:42:16 | 显示全部楼层
  1. def f356(x):
  2.     if x[0]:
  3.         for i in range(len(x)-1):
  4.             if x[i][:-1]!=x[i+1][1:]:
  5.                 return False
  6.         return True
  7.     return False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 20:43:45 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-21 21:47 编辑
  1. def fun356(arr):
  2.     M = len(arr)
  3.     N = len(arr[0])
  4.     if M < N:
  5.         for i in range(0,N-M+1):
  6.             head = arr[0][i]
  7.             for x in range(1,M):
  8.                 if head != arr[x][x+i]:
  9.                     return False
  10.         for i in range(N-M+1,N):
  11.             head = arr[0][i]
  12.             for x in range(1,N-i):
  13.                 if head != arr[x][x+i]:
  14.                     return False
  15.         for j in range(1,M):
  16.             head = arr[j][0]
  17.             for y in range(1,M-j):
  18.                 if head != arr[y+j][y]:
  19.                     return False
  20.     else:
  21.         for j in range(0,M-N+1):
  22.             head = arr[j][0]
  23.             for y in range(1,N):
  24.                 if head != arr[y+j][y]:
  25.                     return False
  26.         for j in range(M-N+1,M):
  27.             head = arr[j][0]
  28.             for y in range(1,M-j):
  29.                 if head != arr[y+j][y]:
  30.                     return False
  31.         for i in range(1,N):
  32.             head = arr[0][i]
  33.             for x in range(1,N-i):
  34.                 if head != arr[x][x+j]:
  35.                     return False
  36.     return True
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 21:24:50 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-21 23:17 编辑
  1. def f356(matrix):
  2.     n = len(matrix[0])
  3.     m = len(matrix)
  4.     if m == 1:
  5.         if n == 1:
  6.             return True
  7.         else:
  8.             return False
  9.     elif n == 1:
  10.         return False
  11.     else:
  12.         for t in range(m - 1):
  13.             if matrix[t][:n - 1] == matrix[t + 1][1:]:
  14.                 continue
  15.             else:
  16.                 return False
  17.         else:
  18.             return True
复制代码

不确定[[1,2]]和[[1],[2]]这种怎么算,就当是False来处理了

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 21:34:17 | 显示全部楼层
  1. def test(lista):
  2.     for index in range(length := len(lista)):
  3.         s = 1
  4.         num = index + 1
  5.         if index + 1 == length:
  6.             return True
  7.         while s < length:
  8.             if lista[index][:-s] != lista[num][s:]:
  9.                 return False
  10.             s += 1
  11.             num += 1
  12.             if num == length:
  13.                 break
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 22:26:05 | 显示全部楼层
我临时想到的一个方法,不过和第一个方法我不太清楚 谁更快。就是说不太清楚python的序列相等运算内部如何实现,知道了可能会好很多
  1. def fun356(arr):,
  2.     M = len(arr)
  3.     head = arr[0]
  4.     for i in range(1,M):
  5.         temp = arr[i]
  6.         if temp[1:] != head[:-1]:
  7.             return False
  8.         else:
  9.             head = temp
  10.     return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 22:37:27 | 显示全部楼层
这种呢 [[1,2]]是True还是False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 22:39:17 | 显示全部楼层
  1. def fun356(lst):
  2.     if len(lst)==1 or len(lst[0])==1:
  3.         return False
  4.     for i in range(len(lst[0])-1):
  5.         if lst[:-1][i]!=lst[1:][i+1]:
  6.             return False
  7.     return True
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 09:36:51 | 显示全部楼层
弱弱的问一下如果要输入矩阵格式的是不是应该先导入Pandas(本人萌新)。。。看到前面回复的鱼油都直接用matrix[][]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 10:04:50 | 显示全部楼层
本帖最后由 suchocolate 于 2020-3-22 21:14 编辑
  1. def fun356(ls):
  2.     for x in range(1, len(ls)):
  3.         for y in range(1, len(ls[0])):
  4.             if ls[x][y] != ls[x-1][y-1]:
  5.                 return False
  6.     return True
复制代码

解题思路:
1.实际要循环的只有绿色区

                               
登录/注册后可看大图

2.循环时只对比上一行前移一个元素

                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-22 10:33:29 | 显示全部楼层
第一天注册,实在是无法完成此类题目啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 10:40:59 | 显示全部楼层
本帖最后由 一个账号 于 2020-3-22 13:41 编辑
  1. import numpy as np

  2. def is_same(one_dimension_array):
  3.     for i in range(len(one_dimension_array)-1):
  4.         if one_dimension_array[i] != one_dimension_array[i+1]:
  5.             return False
  6.     else:
  7.         return True


  8. def perfect_mat(array):
  9.     for index in range(-len(array)+1, len(array[0])-1):
  10.         if not is_same(np.diag(array, index)):
  11.             return False
  12.     else:
  13.         return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 10:51:23 | 显示全部楼层
def func356(matrix):
    m = len(matrix)
    n = len(matrix[0])
    for i in range(m-1):
        if matrix[i][:n-1]!=matrix[i+1][1:]:
            return False
    return True

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 12:19:53 | 显示全部楼层
楼主没有加专辑!@zltzlt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 13:37:42 | 显示全部楼层
  1. def func(arr):
  2.     arr.reverse()
  3.     num = 0
  4.     index = 0
  5.     list1 = []
  6.     while num < len(arr[0])+len(arr)-1:
  7.         for i in range(num, -1, -1):
  8.             if i >= len(arr[0]):
  9.                 index += 1
  10.                 continue
  11.             if index >= len(arr):
  12.                 break
  13.             list1.append(arr[index][i])
  14.             index += 1
  15.         if len(set(list1)) != 1:
  16.             return False
  17.         index = 0
  18.         num += 1
  19.         list1 = []
  20.     return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 13:58:13 | 显示全部楼层
  1. def daily356(matrix: list) -> bool:
  2.     # 判断第i行的前len(num[i])-1个和第i+1行的后len(num[i])-1个是否相同
  3.     for i in range(len(matrix) - 1):  # 最后一行不进行判断
  4.         if matrix[i][:-1] != matrix[i+1][1:] \
  5.                 or len(matrix[i]) != len(matrix[i+1]):
  6.             return False

  7.     return True



  8. if __name__ == '__main__':
  9.     num1 = [
  10.   [1, 2, 3, 4],
  11.   [5, 1, 2, 3],
  12.   [9, 5, 1, 2]
  13. ]
  14.     num2 = [
  15.   [1, 2],
  16.   [2, 2]
  17. ]
  18.     print(daily356(num1))
  19.     print(daily356(num2))
  20.    
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 14:30:17 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-22 15:03 编辑

先来暴力的吧
  1. def f356(arr):
  2.     M, N = len(arr), len(arr[0])
  3.     if M == 1 or N == 1:return True
  4.     for i in range(1, M):
  5.         for j in range(1, N):
  6.             if arr[i][j] != arr[i-1][j-1]:
  7.                 return False
  8.     return True
复制代码

  1. def p356(arr):
  2.     M, N = len(arr), len(arr[0])
  3.     if M == 1 or N == 1:return True
  4.     for i in range(1, M):
  5.         if arr[i-1][:-1] != arr[i][1:]:
  6.             return False

  7.     return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 14:31:15 | 显示全部楼层
本帖最后由 mdphd 于 2020-3-22 14:34 编辑
  1. a = [[1,2,3,4],
  2.      [5,1,2,3],
  3.      [9,5,1,2],
  4.     ]
  5. def f356(a):
  6.     if len(a) <= len(a[0]):
  7.         b = a
  8.     else:
  9.         def transformMatrix(m):
  10.             r = [[] for i in m[0]]
  11.             
  12.             for ele in m:
  13.                 for i in range(len(ele)):
  14.                     r[i].append(ele[i])
  15.             return r
  16.         b = transformMatrix(a)
  17.     M, N = len(b), len(b[0])
  18.     c = 1
  19.     for i in range(1, M - 1):
  20.         for j in range(1, i + 1):
  21.             if b[M - 1 - j][i - j] != b[M - 1][i]:               
  22.                 c = 0
  23.                 break
  24.         if c == 0:
  25.             print("False")
  26.             break
  27.     if c == 1:
  28.         for i in range(M - 1, N):
  29.             for j in range(1, M):
  30.                 if b[M -1 -j][i - j] != b[M - 1][i]:
  31.                     c = 0
  32.                     break
  33.             if c == 0:
  34.                 print("False")
  35.                 break
  36.     if c == 1:
  37.         for i in range(1, M - 1):
  38.             for j in range(1, M - i):
  39.                 if b[M - 1 - i - j][N - 1 - j] != b[M - 1 - i][N - 1]:
  40.                     c = 0
  41.                     break
  42.             if c == 0:
  43.                 print("False")
  44.                 break
  45.     if c == 1:
  46.         print("True")
  47. f356(a)     
复制代码

没仔细想,这个方法很差,前面的大佬确实厉害!

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表