问题

螺旋矩阵

给定一个包含 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]

分析

限定好前进方向以及边界,一个一个遍历下去即可,最近开始用Go,感觉很是不错,特意选了Go练习,AC code如下

···

func spiralOrder(matrix [][]int) []int {

var ret []int

ret = make([]int, 0)

n := len(matrix)

if n == 0 {

return ret

}

m := len(matrix[0])

//获取到了矩阵大小,
counter := 0 //记录处理个数
limu, limd, liml, limr := -1, n, -1, m
tmpx, tmpy := 0, 0
direction := 0 // 0 right 1 down 2 left7 3 up
for {
if counter == n*m {
return ret
}
ret = append(ret, matrix[tmpx][tmpy])
counter++
getNextIndex(&limu, &limd, &liml, &limr, &direction, &tmpx, &tmpy)
}

}

//获取下一个坐标,同时有可能更新方向、边界等

func getNextIndex(limu *int, limd *int, liml *int, limr *int, direction *int, x *int, y int) {

//fmt.Println(
limu, *limd, *liml, *limr, *direction, *x, *y)

switch *direction {

case 0:

//to right

if *y+1 < *limr {

//正常更新

*y += 1

return

} else {

//到了右边界,需要更新方向以及边界,已经通过个数限定,所以改变方向后肯定可行

*limu += 1

*direction = 1

*x += 1

}

case 1:

//to down

if *x+1 < *limd {

//正常更新

*x += 1

return

} else {

//到了下边界,需要更新方向以及边界,

*limr -= 1

*direction = 2

*y -= 1

}

case 2:

//to right

if *y-1 > *liml {

//正常更新

*y -= 1

return

} else {

//到了左边界,需要更新方向以及边界,

*limd -= 1

*direction = 3

*x -= 1

}

case 3:

//to up

if *x-1 > *limu {

//正常更新

*x -= 1

return

} else {

//到了左边界,需要更新方向以及边界,已经通过个数限定,所以改变放下后肯定可行

*liml += 1

*direction = 0

*y += 1

}

}

}

···

其他

1.初次提交后由于空输入错了一次,应该更多的考虑特殊情况。

2.使用go的另一个好处就是可以很方便的进行测试,比如main.go中编写了解题函数,只需要一个公开的壳函数就能在mai_test.go中测试

···

func TspiralOrder(matrix [][]int) []int {

return spiralOrder(matrix)

}

···

而在测试中通过编写测试数据测试结果,可以方便的添加新的测试数据,同时能够避免改动导致原本能通过的数据failed。

···

func TestTspiralOrder(t *testing.T) {

var testData [][][]int

var tmpdata [][]int

var testReslut [][]int

var tmpanswer []int

tmpdata = [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}}
testData = append(testData, tmpdata)
tmpanswer = []int{1, 2, 3, 6, 9, 8, 7, 4, 5}
testReslut = append(testReslut, tmpanswer) tmpdata = [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}}
testData = append(testData, tmpdata)
tmpanswer = []int{1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7}
testReslut = append(testReslut, tmpanswer) tmpdata = make([][]int, 0)
testData = append(testData, tmpdata)
tmpanswer = make([]int, 0)
testReslut = append(testReslut, tmpanswer) for i := 0; i != len(testData); i++ {
tmp := TspiralOrder(testData[i])
fmt.Println(tmp)
if IsTwoArraySame(tmp, testReslut[i]) == true {
fmt.Println("Pass")
} else {
fmt.Println("Failed")
}
}

}

···

LeetCode之螺旋矩阵的更多相关文章

  1. LeetCode:螺旋矩阵||【59】

    LeetCode:螺旋矩阵||[59] 题目描述 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ...

  2. LeetCode:螺旋矩阵【54】

    LeetCode:螺旋矩阵[54] 题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], ...

  3. LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)

    题目描述 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7 ...

  4. Java实现 LeetCode 59 螺旋矩阵 II

    59. 螺旋矩阵 II 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ...

  5. Java实现 LeetCode 54 螺旋矩阵

    54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...

  6. leetcode 54. 螺旋矩阵 及 59. 螺旋矩阵 II

    54. 螺旋矩阵 问题描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...

  7. [Leetcode]59.螺旋矩阵Ⅱ

    给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, ...

  8. LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵

    题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, ...

  9. LeetCode 59. Spiral Matrix II (螺旋矩阵之二)

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

随机推荐

  1. 题解 [HNOI2002]DNA分子的最佳比对 (洛谷P2268)

    题目传送门 (这道题告诉我:初始化要小心) 有没有一点最长公共子序列的赶脚(口胡) 但我觉得挺像 设 表示匹配到s1的第i位,s2的第j位,则有 的初始化要注意:根据的含义,表示s1[i]一直在匹配空 ...

  2. Java EE学习笔记(九)

    MyBatis的关联映射 1.关联关系概述 1).实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通 ...

  3. 微信android手机中点击大图片会自动放大图片

    自己使用的是微信Android客户端,使用img标签的src属性将图片设置好了以后,在微信中调试,点击图片竟然放大,自己没写放大图片的方法,也没有调用wx.previewImage()方法,最后查找, ...

  4. Fleet(集群管理器)

    工作原理 fleet 是通过systemd来控制你的集群的,控制的任务被称之为unit(单元),控制的命令是fleetctl unit运行方式 unit的运行方式有两种: standard globa ...

  5. [20190614]webpack+vue学习记录

    本文记录一些学习webpack+vue相关的知识点,方便以后查阅,添加或修改 1. 初始化vue项目的代码结构 build--项目依赖包配置信息 config--项目配置文件 dev.env.js-- ...

  6. mysql操作封装

    <?php//连接数据库function connect(){  $link = mysql_connect(DB_HOST,DB_USER,DB_PWD)or die("数据库连接失 ...

  7. leetcdoe Valid Anagram

    题目连接 https://leetcode.com/problems/valid-anagram/ Valid Anagram Description Given two strings s and ...

  8. Elasticsearch-基本操作1

    Elasticsearch版本:6.0 一.文档 一个文档不仅包含数据,也包含元数据,三个必须的元数据如下 _index:具有共同特性分到一起的文档集合,标示了文档的存放位置: 名字小写,不以下划线开 ...

  9. UWP开发:应用设置存储

    应用设置储存指的是保存在应用程序储存区中的键/值对的字典集合,它自动负责序列化对象,并将其保存在应用程序里.以键/值对方式提供一种快速数据访问的方式,主要用于储存一些应用信息. 1,简介 应用设置是W ...

  10. jquery.restrictFieldLength.js

    1.参考资料 http://www.cnblogs.com/aarond/archive/2013/08/02/3234042.html 2.使用举例 //字符控制 $(function () { $ ...