k6k4刷题-矩阵打印--螺旋状

来源:互联网 发布:android 仿淘宝购物车 编辑:程序博客网 时间:2024/06/10 17:11

今天刷了一道k6k4上的题目,分享一下(欢迎加 算法刷题交流QQ群:474397739 一起讨论解决各大刷题网站题目)

原题:http://www.k6k4.com/code/qshow/aanstqymm1509803030578

从矩阵的第一个元素A[0][0] 开始,顺时针遍历矩阵的最外层元素,然后从A[1][1]遍历矩阵第二层元素,以此类推,直到遍历完所有的矩阵元素。将结果按遍历顺序放在数组中返回。提示:矩阵不一定是方正

解题思路:

固定四个顶点,按顺序打印上边、右边、下边、左边,需要特别注意已经遍历过的顶点,使用一个数组记录已经遍历过的点。


直接上代码:

    import java.util.*;         public class Main {        public static void main(String[] args) {            int[][] x = new int[][]{                    new int[]{11, 12, 13, 14, 15},                    new int[]{16, 17, 18, 19, 20},                    new int[]{21, 22, 23, 24, 25},                    new int[]{26, 27, 28, 29, 30},                    new int[]{31, 32, 33, 34, 35},            };                 int[] result = solution(x, 5, 5);                  StringBuffer sb = new StringBuffer();            for (int i = 0; i < result.length; i++) {                sb.append(result[i] + ",");            }            String str = sb.toString();            if (str.endsWith(",")) {                str = str.substring(0, str.length() - 1);            }                 System.out.println(sb);            //输出:11,12,13,14,15,20,25,30,35,34,33,32,31,26,21,16,17,18,19,24,29,28,27,22,23             }             public static int[] solution(int[][] A, int n, int m) {                 boolean[][] visited = new boolean[n][m];            for (int i = 0; i < n; i++)                for (int j = 0; j < m; j++)                    visited[i][j] = false;                 int left = 0;            int right = m - 1;            int up = 0;            int down = n - 1;                 int index = 0;            int len = n * m;            int[] result = new int[len];            int x, y;            while (index < len) {                     //从左上角开始,从左到右打印                x = left;                y = up;                for (; x <= right && !visited[y][x]; x++) {                    result[index++] = A[y][x];                    visited[y][x] = true;                     }                     //从右上角(往下移一个元素)开始,从上往下打印                x = right;                y = up + 1;                for (; y <= down && !visited[y][x]; y++) {                    result[index++] = A[y][x];                    visited[y][x] = true;                }                     //从右下角(往左移一个元素)开始,从右往左打印                x = right - 1;                y = down;                for (; x >= left && !visited[y][x]; x--) {                    result[index++] = A[y][x];                    visited[y][x] = true;                }                     //从左下角(往上移一个元素)开始,从下往上打印                x = left;                y = down - 1;                for (; y >= up && !visited[y][x]; y--) {                    result[index++] = A[y][x];                    visited[y][x] = true;                }                     left++;                up++;                right--;                down--;                 }                 return result;        }    }


原创粉丝点击