题目描述:
思路 :
建立一个list,遍历数组中行(列)添加到list中,然后改变数组的遍历方向顺时针(逆时针)旋转90度,知道遍历完成。
顺时针代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test1
{
//顺时针打印矩阵
class OrderPrint
{
public static List<int> Solution(int[][] arrs)
{
List<int> list = new List<int>();
int rows = arrs.Length; //总行数
int cols = arrs[0].Length; //总列数
if (rows == 0 || cols == 0 || arrs == null)
{
return null;
}
int start = 0;
while (start * 2 < rows && start * 2 < cols)
{
PrintMatrix(list, rows, cols, arrs, start);
start++; //只算前面的索引
}
return list;
}
/// <summary>
/// 用于将数组中的元素添加到链表中
/// </summary>
/// <param name="list"></param>
/// <param name="rows"></param>
/// <param name="cols"></param>
/// <param name="arrs"></param>
/// <param name="start"></param>
/// <returns></returns>
private static List<int> PrintMatrix(List<int> list,int rows,int cols,int[][] arrs,int start)
{
int endX = cols - 1 - start; //得到这一行剩余的元素个数
int endY = rows - 1 - start; //得到这一列剩余的元素个数
//将从左到右的元素加入链表
for (int i = start; i <= endX; i++)
{
int number = arrs[start][i];
list.Add(number);
}
//右侧从上往下将元素加入链表
if (start < endY)
{
for (int i = start + 1; i <= endY; i++)
{
int number = arrs[i][endX];
list.Add(number);
}
}
//下方从右往左
if (start < endX && start < endY)
{
for (int i = endX - 1; i >= start; i--)
{
int number = arrs[endY][i];
list.Add(number);
}
}
//左侧从下往上
if (start < endX && start < endY - 1)
{
for (int i = endY - 1; i >= start + 1; i--)
{
int number = arrs[i][start];
list.Add(number);
}
}
return list;
}
}
}
逆时针代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test1
{
//逆时针打印矩阵
class ReOrderPrint
{
public static List<int> Solution(int[][] arrs)
{
List<int> list = new List<int>();
int rows = arrs.Length;
int cols = arrs[0].Length;
if (arrs == null || rows == 0 || cols == 0)
{
return null;
}
int start = 0;
while (start * 2 < rows && start * 2 < cols)
{
PrintMatrix(list, rows, cols, arrs, start);
start++;
}
return list;
}
private static List<int> PrintMatrix(List<int> list, int rows, int cols, int[][] arrs, int start)
{
int endX = cols - 1 - start;
int endY = rows - 1 - start;
//从上到下
for (int i = start; i <= endY; i++)
{
int number = arrs[i][start];
list.Add(number);
}
//从左到右
if (start < endY && start <endX)
{
for (int i = start + 1; i <= endX; i++)
{
int number = arrs[endY][i];
list.Add(number);
}
}
//从下到上
if (start < endY && start < endX)
{
for (int i = endY - 1; i >= start; i--)
{
int number = arrs[i][endX];
list.Add(number);
}
}
//从右到左
if (start < endX && start < endY)
{
for (int i = endX - 1; i > start; i--)
{
int number = arrs[start][i];
list.Add(number);
}
}
return list;
}
}
}
测试代码:
运行结果: