鱼C论坛

 找回密码
 立即注册
查看: 1308|回复: 7

[技术交流] 成长每一点---题库18---4 Kuy(难度--二维数组降维)

[复制链接]
发表于 2019-4-29 23:17:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Stubborn 于 2019-4-30 16:40 编辑

Snail
编写一个函数,参数将接收到一个二维数组,并返回一个一维列表

array = [[1,2,3],
         [4,5,6],
         [7,8,9]]

返回的结果
snail(array) #=> [1,2,3,6,9,8,7,4,5]

array = [[1,2,3],
         [8,9,4],
         [7,6,5]]

返回的结果
snail(array) #=> [1,2,3,4,5,6,7,8,9]

假如上面例子看不明白,相信你看这个可以明白

snail.png

5*5
[[13 14 15 16  1]
[12 23 24 17  2]
[11 22 25 18  3]
[10 21 20 19  4]
[ 9  8  7  6  5]]

6*6
[[16 17 18 19 20  1]
[15 30 31 32 21  2]
[14 29 36 33 22  3]
[13 28 35 34 23  4]
[12 27 26 25 24  5]
[11 10  9  8  7  6]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 06:50:45 From FishC Mobile | 显示全部楼层
蛇行矩阵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-30 15:26:01 | 显示全部楼层
  1. #coding: utf-8
  2. import numpy as np

  3. def main():
  4.     N = int(input('请输入数字:'))
  5.     myarray = np.zeros((N, N), dtype=np.int16)
  6.     x, y = 0, N - 1
  7.     res = myarray[x][y] = 1
  8.     while(res < N * N):
  9.       while(x + 1 < N and (not myarray[x + 1][y])):
  10.         res += 1
  11.         x += 1
  12.         myarray[x][y] = res
  13.       while(y - 1 >= 0 and not myarray[x][y - 1]):
  14.         res += 1
  15.         y -= 1
  16.         myarray[x][y] = res
  17.       while(x - 1 >= 0 and not myarray[x - 1][y]):
  18.         res += 1
  19.         x -= 1
  20.         myarray[x][y] = res
  21.       while(y + 1 < N and not myarray[x][y + 1]):
  22.         res += 1
  23.         y += 1
  24.         myarray[x][y] = res
  25.     print(myarray)
  26. if __name__ == '__main__':
  27.     main()
复制代码


网上copy得 实测可用,就是转角顺序有点差异

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-4-30 16:05:46 | 显示全部楼层
wp231957 发表于 2019-4-30 15:26
网上copy得 实测可用,就是转角顺序有点差异

我这个是降维啊,把接受到的二维数组,按照蛇形降维到一维列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-30 18:48:15 | 显示全部楼层
Stubborn 发表于 2019-4-30 16:05
我这个是降维啊,把接受到的二维数组,按照蛇形降维到一维列表

简单改一下就好了:

  1. #coding: utf-8
  2. import numpy as np

  3.    
  4. if __name__ == '__main__':
  5.     N = int(input('请输入数字:'))
  6.     myarray = np.zeros((N, N), dtype=np.int16)
  7.     x, y = 0, 0
  8.     res = myarray[x][y] = 1
  9.     while(res < N * N):
  10.       while(y + 1 < N and not myarray[x][y + 1]):
  11.         res += 1
  12.         y += 1
  13.         myarray[x][y] = res
  14.       while(x + 1 < N and (not myarray[x + 1][y])):
  15.         res += 1
  16.         x += 1
  17.         myarray[x][y] = res
  18.       while(y - 1 >= 0 and not myarray[x][y - 1]):
  19.         res += 1
  20.         y -= 1
  21.         myarray[x][y] = res
  22.       while(x - 1 >= 0 and not myarray[x - 1][y]):
  23.         res += 1
  24.         x -= 1
  25.         myarray[x][y] = res
  26.     lst=[]
  27.     for i in range(N):
  28.       for j in range(N):
  29.         lst.append(myarray[i][j])
  30.     print(lst)
复制代码


e:\pytest>python ex27.py
请输入数字:5
[[ 1  2  3  4  5]
[16 17 18 19  6]
[15 24 25 20  7]
[14 23 22 21  8]
[13 12 11 10  9]]

e:\pytest>python ex27.py
请输入数字:10
[[  1   2   3   4   5   6   7   8   9  10]
[ 36  37  38  39  40  41  42  43  44  11]
[ 35  64  65  66  67  68  69  70  45  12]
[ 34  63  84  85  86  87  88  71  46  13]
[ 33  62  83  96  97  98  89  72  47  14]
[ 32  61  82  95 100  99  90  73  48  15]
[ 31  60  81  94  93  92  91  74  49  16]
[ 30  59  80  79  78  77  76  75  50  17]
[ 29  58  57  56  55  54  53  52  51  18]
[ 28  27  26  25  24  23  22  21  20  19]]

e:\pytest>python ex27.py
请输入数字:5
[1, 2, 3, 4, 5, 16, 17, 18, 19, 6, 15, 24, 25, 20, 7, 14, 23, 22, 21, 8, 13, 12, 11, 10, 9]

e:\pytest>python ex27.py
请输入数字:10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 36, 37, 38, 39, 40, 41, 42, 43, 44, 11, 35, 64, 65, 66, 67, 68, 69, 70, 45, 12, 34, 63, 84, 85, 86, 87, 88, 71, 46, 13, 33, 62, 83, 96, 97, 98, 89, 72, 47, 14, 32, 61, 82, 95, 100, 99, 90, 73, 48, 15, 31, 60, 81, 94, 93, 92, 91, 74, 49, 16, 30, 59, 80, 79, 78, 77, 76, 75, 50, 17, 29, 58, 57, 56, 55, 54, 53, 52, 51, 18, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19]

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

使用道具 举报

 楼主| 发表于 2019-4-30 22:48:00 | 显示全部楼层
wp231957 发表于 2019-4-30 18:48
简单改一下就好了:

我该怎么说呢...看看题目,有实例演示,图片说明的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-1 00:23:20 | 显示全部楼层
本帖最后由 Stubborn 于 2019-5-1 00:27 编辑

自己的方案
  1. def snail(array):
  2.     result = []
  3.     if len(array)==0:
  4.         return None
  5.     def eliminate(array):
  6.         result = []
  7.         try:
  8.             result += array[0]
  9.             del array[0]
  10.             for i in array:
  11.                 result.append(i.pop())
  12.             li = array[-1]
  13.             li.reverse()
  14.             result += li
  15.             del array[-1]
  16.             lis = []
  17.             for i in array:
  18.                 lis.append(i[0])
  19.                 i.remove(i[0])
  20.             lis.reverse()
  21.             result += lis
  22.             return result
  23.         except IndexError as e:
  24.             return result

  25.     iNum = len(array)//2 + 1
  26.     for i in range(iNum):
  27.         if len(array) == 1:
  28.             result +=array[0]
  29.             return result
  30.         else:
  31.             result += eliminate(array)
  32.     return result
  33. “”“
  34. Test Results:
  35. Fixed tests
  36. Tests (5 of 5 Assertions)
  37. Completed in 0.10ms
  38. Random tests
  39. Tests (100 of 100 Assertions)
  40. Completed in 53.75ms
  41. You have passed all of the tests! :)
  42. “””
复制代码


最聪明以及最佳实践
  1. def snail(array):
  2.     return list(array[0]) + snail(zip(*array[1:])[::-1]) if array else []
复制代码


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

使用道具 举报

发表于 2019-5-6 11:04:18 | 显示全部楼层
  1. return list(array[0]) + snail(list(zip(*array[1:]))[::-1]) if array else []
复制代码


zip 返回的对象需要转为列表吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 19:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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