鱼C论坛

 找回密码
 立即注册
查看: 3464|回复: 37

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

[复制链接]
发表于 2019-12-14 20:12:28 | 显示全部楼层 |阅读模式

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

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

x
今天的题目:


给定一个包含 m x n 个元素的矩阵(m 行,n 列),请按照顺时针螺旋顺序返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出:[1, 2, 3, 6, 9, 8, 7, 4, 5]
示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12]
]
输出:[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]


欢迎大家一起答题!
最佳答案
2019-12-14 21:26:22
本帖最后由 冬雪雪冬 于 2019-12-14 21:58 编辑
  1. def fun(lst):
  2.     result = []
  3.     while lst:
  4.         result.extend(lst.pop(0))
  5.         lst = list(reversed(list(zip(*lst))))
  6.     return result
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2019-12-14 20:18:45 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-14 21:39 编辑

抢沙发
代码:
  1. def solve(matrix:'传入的矩阵')->list:
  2.     '''
  3.     爱滴魔力转圈圈~~~
  4.     传入的矩阵要严格符合矩形的设定,其中不可有长度不一样的子列表
  5.     '''
  6.     if matrix==[[]] or matrix==[]:
  7.         return []
  8.     def get():
  9.         limit = [0,len(matrix),0,len(matrix[0])]#[上,下,左,右]
  10.         y,x = limit[0],limit[2]
  11.         direction = 3
  12.         while True:
  13.             #print('调试',limit,x,y,direction)
  14.             if direction == 3:#往右去
  15.                 if x < limit[3]:#没过界
  16.                     yield matrix[y][x]
  17.                     x += 1
  18.                 elif y < limit[1]-1:#已过界但可以转向
  19.                     limit[0] += 1
  20.                     y = limit[0]
  21.                     x -= 1
  22.                     direction = 1
  23.                 else:#走投无路
  24.                     break
  25.             elif direction == 1:#往下去
  26.                 if y < limit[1]:#没过界
  27.                     yield matrix[y][x]
  28.                     y += 1
  29.                 elif x > limit[2]:#已过界但可以转向
  30.                     limit[3] -= 1
  31.                     x = limit[3] - 1
  32.                     y -= 1
  33.                     direction = 2
  34.                 else:#走投无路
  35.                     break
  36.             elif direction == 2:#往左去
  37.                 if x >= limit[2]:#没过界
  38.                     yield matrix[y][x]
  39.                     x -= 1
  40.                 elif y > limit[0]:#已过界但可以转向
  41.                     limit[1] -= 1
  42.                     y = limit[1] - 1
  43.                     x += 1
  44.                     direction = 0
  45.                 else:#走投无路
  46.                     break
  47.             elif direction == 0:#往上去
  48.                 if y >= limit[0]:#没过界
  49.                     yield matrix[y][x]
  50.                     y -= 1
  51.                 elif x < limit[3]-1:#已过界但可以转向
  52.                     limit[2] += 1
  53.                     x = limit[2]
  54.                     y += 1
  55.                     direction = 3
  56.                 else:#走投无路
  57.                     break
  58.     return list(get())
  59. if __name__ == '__main__':
  60.     print('示例1 输出:',solve([
  61. [ 1, 2, 3 ],
  62. [ 4, 5, 6 ],
  63. [ 7, 8, 9 ]
  64. ]))
  65.     print('示例2 输出:',solve([
  66.   [1, 2, 3, 4],
  67.   [5, 6, 7, 8],
  68.   [9, 10, 11, 12]
  69. ]))

复制代码



评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-14 20:33:19 | 显示全部楼层
问一下,对于空的情况需要 考虑吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-14 20:51:49 | 显示全部楼层
本帖最后由 塔利班 于 2019-12-14 20:53 编辑
  1. def f290(x):
  2.     def f(x,n):
  3.         if n==0:
  4.             return x[0]+f(x[1:],1) if len(x)>1 else x[0]
  5.         elif n==1:
  6.             return [e[-1] for e in x]+f([e[:-1] for e in x],2) if len(x[0])>1 else [e[-1] for e in x]
  7.         elif n==2:
  8.             return x[-1][::-1]+f(x[:-1],3) if len(x)>1 else x[-1][::-1]
  9.         else:
  10.             return [e[0] for e in x][::-1]+f([e[1:] for e in x],0) if len(x[0])>1 else [e[0] for e in x][::-1]
  11.     return f(x,0)
复制代码

先写个蠢得

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-14 20:59:56 | 显示全部楼层
  1. def solve(list1):
  2.     m = len(list1)
  3.     if m == 0:
  4.         return []
  5.     n = len(list1[0])
  6.     if n == 0:
  7.         return []
  8.     if m == 1:
  9.         return list1[0]
  10.     if n == 1:
  11.         return [each[0] for each in list1]
  12.     number = m*n
  13.     course1 = 0
  14.     course2 = 0
  15.     result = []
  16.     loop = 1
  17.     while len(result) < number:
  18.         if n%2 == 1 and m%2 == 1 and loop == n//2 + 1:
  19.             result.append(list1[course1][course2])
  20.             break
  21.         while course2 < n - loop:
  22.             result.append(list1[course1][course2])
  23.             course2 += 1
  24.         while course1 < m - loop:
  25.             result.append(list1[course1][course2])
  26.             course1 += 1
  27.         while course2 > loop - 1:
  28.             result.append(list1[course1][course2])
  29.             course2 -= 1
  30.         while course1 > loop - 1:
  31.             result.append(list1[course1][course2])
  32.             course1 -= 1
  33.         course1 = loop
  34.         course2 = loop
  35.         loop += 1
  36.     return result
复制代码

并不知道空列表或者只有一行(列)时应该返回什么

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-14 21:26:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 冬雪雪冬 于 2019-12-14 21:58 编辑
  1. def fun(lst):
  2.     result = []
  3.     while lst:
  4.         result.extend(lst.pop(0))
  5.         lst = list(reversed(list(zip(*lst))))
  6.     return result
复制代码

评分

参与人数 2荣誉 +4 鱼币 +4 贡献 +3 收起 理由
零0℃度 + 1 + 1 这个牛B
zltzlt + 3 + 3 + 3 20 ms, you rock !

查看全部评分

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

使用道具 举报

发表于 2019-12-14 21:32:21 | 显示全部楼层
本帖最后由 TJBEST 于 2019-12-14 23:01 编辑

非常傻的一个方法 我自己测试 1000x1000的矩阵是  526ms 可能不符合版主的要求  先这样,我明天再想想能不能简化和优化
  1. def fun290(matrix):
  2.     if matrix==[] or matrix==[[]]:
  3.         return []
  4.     else:
  5.         m = len(matrix)
  6.         n = len(matrix[0])
  7.         index = 0
  8.         result = []
  9.         while True:
  10.             for first in range(index,n-index):
  11.                 result.append(matrix[index][first])
  12.             if len(result)== m*n:
  13.                 break
  14.             for second in range(index+1,m-index):
  15.                 result.append(matrix[second][n-(index+1)])
  16.             if len(result)== m*n:
  17.                 break
  18.             for third in range(index+2,n-index+1):
  19.                 result.append(matrix[m-(index+1)][n-third])
  20.             if len(result)== m*n:
  21.                 break
  22.             for fourth in range(index+2,m-index):
  23.                 result.append(matrix[m-fourth][index])
  24.             if len(result)== m*n:
  25.                 break
  26.             index =index+1
  27.         return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-14 22:14:11 | 显示全部楼层
  1. def a(list_1):
  2.     s=[]
  3.     while len(list_1)>2:
  4.         s=s+list_1[0]
  5.         del list_1[0]
  6.         for index,o in enumerate(list_1[:-1]):
  7.             if len(o)==0:
  8.                 break
  9.             s.append(o[-1])
  10.             del list_1[index][-1]
  11.         list_1[-1].reverse()
  12.         s=s+list_1[-1]
  13.         del list_1[-1]
  14.         list_1=list_1[::-1]
  15.         for index,o in enumerate(list_1):
  16.             if len(o)==0:
  17.                 break
  18.             s.append(o[0])
  19.             del list_1[index][0]
  20.         list_1.reverse()
  21.     if len(list_1)==2:
  22.         s=s+list_1[0]
  23.         del list_1[0]
  24.         list_1[-1].reverse()
  25.         s=s+list_1[-1]
  26.         del list_1[-1]
  27.     elif len(list_1)==1:
  28.         s=s+list_1[0]
  29.     return s
复制代码

只会这样的,复杂的不会写

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-12-14 22:31:04 | 显示全部楼层
TJBEST 发表于 2019-12-14 20:33
问一下,对于空的情况需要 考虑吗?


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

使用道具 举报

发表于 2019-12-14 22:53:43 | 显示全部楼层
本帖最后由 凌九霄 于 2019-12-15 01:23 编辑
  1. def func290(l: list, result=[]):
  2.     while 1:
  3.         try:
  4.             R = len(l)
  5.             result.extend(l.pop(0))
  6.             for i in range(R - 1):
  7.                 result.append(l[i].pop())
  8.             result.extend(l.pop()[::-1])
  9.             for i in range(1, R - 1):
  10.                 result.append(l[-i].pop(0))
  11.         except (IndexError,TypeError):
  12.               return result
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 32 ms

查看全部评分

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

使用道具 举报

发表于 2019-12-15 01:03:54 | 显示全部楼层
  1. def fun290(matrix):
  2.     if len(matrix)==0 or len(matrix[0])==0:
  3.         return []
  4.     x0=0
  5.     y0=0
  6.     xm=len(matrix[0])
  7.     ym=len(matrix)

  8.     x=0
  9.     y=0
  10.     ret=[]
  11.     while (xm>x0 and ym>y0):
  12.         ret.extend(matrix[y][x:xm])
  13.         y+=1
  14.         x=xm-1
  15.         y0+=1
  16.         for y in range(y,ym):
  17.             ret.append(matrix[y][x])
  18.         x-=1
  19.         xm-=1
  20.         if (xm<=x0 or ym<=y0):
  21.             break

  22.         ret.extend(reversed(matrix[y][x0:x+1]))
  23.         y-=1
  24.         x=x0
  25.         ym-=1
  26.         for y in range(y,y0-1,-1):
  27.             ret.append(matrix[y][x])
  28.         x+=1
  29.         x0+=1

  30.     return ret
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 40 ms

查看全部评分

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

使用道具 举报

发表于 2019-12-15 03:19:53 | 显示全部楼层
本帖最后由 Stubborn 于 2019-12-15 03:22 编辑
  1. def snail(array):
  2.     a = []
  3.     while array:
  4.         a.extend(list(array.pop(0)))
  5.         array = list(zip(*array))
  6.         array.reverse()
  7.     return a
复制代码

  1. def snail(array):
  2.     return list(array[0]) + snail(list(zip(*array[1:]))[::-1]) if array else []
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 28 ms

查看全部评分

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

使用道具 举报

发表于 2019-12-15 03:40:12 | 显示全部楼层
本帖最后由 hrp 于 2019-12-15 07:06 编辑

1000*1000的矩阵下,两种方法耗时都差不多。

  1. def func290(matrix):
  2.     result = []
  3.     if (not matrix) or (not matrix[0]):
  4.         return result
  5.     mv = 'r'                  # 'r'往右,'d'往下,'l'往左,'u'往上
  6.     yu, yd = 0, len(matrix)-1
  7.     while yu != yd:
  8.         if mv == 'r':
  9.             result.extend(matrix[yu])
  10.             yu += 1
  11.             rn = yu
  12.             mv = 'd'
  13.         elif mv == 'd':
  14.             if rn < yd:
  15.                 result.append(matrix[rn].pop(-1))
  16.                 rn += 1
  17.                 continue
  18.             mv = 'l'
  19.         elif mv == 'l':
  20.             matrix[yd].reverse()
  21.             result.extend(matrix[yd])
  22.             yd -= 1
  23.             rn = yd
  24.             mv = 'u'
  25.         elif mv == 'u':
  26.             if rn > yu:
  27.                 result.append(matrix[rn].pop(0))
  28.                 rn -= 1
  29.                 continue
  30.             mv = 'r'
  31.     if mv == 'u':
  32.         result.extend(matrix[yu])
  33.     elif mv == 'd':
  34.         matrix[yd].reverse()
  35.         result.extend(matrix[yd])
  36.     return result
复制代码

  1. def func290(matrix):
  2.     result = []
  3.     if (not matrix) or (not matrix[0]):
  4.         return result
  5.     mv = 'r'                  # 'r'往右,'d'往下,'l'往左,'u'往上
  6.     yu, yd = 0, len(matrix)-1
  7.     xr, xl = 0, len(matrix[0])
  8.     while (yu != yd) and (xr != xl):
  9.         if mv == 'r':
  10.             result.extend(matrix[yu][xr:xl])
  11.             yu += 1
  12.             rn = yu
  13.             mv = 'd'
  14.         elif mv == 'd':
  15.             if rn <= yd:
  16.                 result.append(matrix[rn][xl-1])
  17.                 rn += 1
  18.                 continue
  19.             rn -= 1
  20.             xl -= 1
  21.             mv = 'l'
  22.         elif mv == 'l':
  23.             temp = matrix[yd][xr:xl]
  24.             temp.reverse()
  25.             result.extend(temp)
  26.             yd -= 1
  27.             rn = yd
  28.             mv = 'u'
  29.         elif mv == 'u':
  30.             if rn >= yu:
  31.                 result.append(matrix[rn][xr])
  32.                 rn -= 1
  33.                 continue
  34.             rn += 1
  35.             xr += 1
  36.             mv = 'r'
  37.     if mv == 'u':
  38.         result.extend(matrix[yu][xr:xl])
  39.     elif mv == 'd':
  40.         temp = matrix[yd][xr:xl]
  41.         temp.reverse()
  42.         result.extend(temp)
  43.     elif mv == 'r':
  44.         for i in range(yu,yd+1):
  45.             result.append(matrix[i][xr])
  46.     elif mv == 'l':
  47.         for i in range(yd,yu-1,-1):
  48.             result.append(matrix[i][xl-1])
  49.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-15 11:56:48 | 显示全部楼层

还有这等操作,列表自己元素结合,长见识了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-15 12:26:07 | 显示全部楼层
确实服了,原来可以这么简单,那我就将就冬雪大佬的代码写个逆时针版的吧
  1. def fun(lst):
  2.     lst=list(zip(*lst))
  3.     result = []
  4.     while lst:
  5.         result.extend(lst.pop(0))
  6.         lst = list(reversed(list(zip(*lst))))
  7.     return result
  8. print(fun([[1,2,3],[4,5,6],[7,8,9]]))
复制代码

再次膜拜冬雪大佬。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-15 12:49:52 | 显示全部楼层
fan1993423 发表于 2019-12-15 12:26
确实服了,原来可以这么简单,那我就将就冬雪大佬的代码写个逆时针版的吧
再次膜拜冬雪大佬。

但是题目要求顺时针呢

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-15 14:02:41 | 显示全部楼层

输入空列表报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-15 14:04:00 | 显示全部楼层
danteer 发表于 2019-12-14 20:59
并不知道空列表或者只有一行(列)时应该返回什么

解答错误

输入:[[2,3,4],[5,6,7],[8,9,10],[11,12,13],[14,15,16]]
输出:[2,3,4,7,10,13,16,15,14,11,8,5,6]
预期结果:[2,3,4,7,10,13,16,15,14,11,8,5,6,9,12]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-15 14:09:40 | 显示全部楼层
hrp 发表于 2019-12-15 03:40
1000*1000的矩阵下,两种方法耗时都差不多。

第二个解答错误

输入:[[2,3]]
输出:[2]
预期结果:[2,3]

第一个解答错误

输入:[[1]]
输出:[]
预期结果:[1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-15 14:19:28 | 显示全部楼层
  1. import numpy as np

  2. def snail(snail_map):
  3.     t = np.array(snail_map)
  4.     res = []
  5.     while t.size > 0:
  6.         for each in t[0]:
  7.             res.append(each)   
  8.         t = t[1:].T[::-1]      
  9.     return res
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 11:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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