12 蛇形打印矩阵中的数据
来源:互联网 发布:淘宝客服销售是干什么 编辑:程序博客网 时间:2024/06/05 05:45
前言
本博文部分图片, 思路来自于剑指offer 或者编程珠玑
问题描述
示例
思路
对于这个问题, 书上给出的解法是给定一个索引表示当前打印的第几圈, 然后一圈一圈的打印
书中的思路 我会在下面贴出来
而下面的参考代码是我的思路, 这道题似乎 我在两年前就见过了吧, 而解答的思路就是那个时候的思路
代码中还有一个方法是生成蛇形矩阵, 思路和上面蛇形打印矩阵的思路一致
思路如下 :
书中的思路
参考代码
/** * file name : Test05ClockwisePrintMatrix.java * created at : 10:08:32 AM Jun 7, 2015 * created by 970655147 */package com.hx.test05;import com.hx.util.Log;public class Test05ClockwisePrintMatrix { // 打印蛇形矩阵, 顺时针打印int[][] public static void main(String[] args) { int width = 3, height = 4; int[][] arr = generateTwoDimenArr(width, height); Log.logWithoutPosition(arr); clockwisePrintMatrix(arr); // ---------------------- generateSnakeMatrix(arr); Log.enter(); Log.horizon(); Log.logWithoutPosition(arr); } // 打印蛇形矩阵 // 思路 : 打印(0, 0) -> (width, 0) 需要打印width-diff个数字, diff随着循环而变化 // 打印(width, 0) -> (width, height) 需要打印height-diff-1个数字 // 打印(width, height) -> (0, height) 需要打印width-diff-1个数字 // 打印(0, height) -> (0, 1) 需要打印height-diff-2个数字 // 每一次循环diff + 1, 本程序 这里就直接在第一次打印 和第三次打印 将diff更新了 // 请注意 更新row, col的方式 如果你不理解的话 请画一个矩阵 试着走一下, 可以帮你理解这个逻辑 public static void clockwisePrintMatrix(int[][] arr) { int diff = 0; int rowNum = arr.length, colNum = arr[0].length; int printed = 0, eleNum = arr.length * arr[0].length; int row = 0, col = 0; while(true) { // (0, 0) -> (width, 0) for(int i=0; i<colNum-diff; i++) { Log.logWithoutLn(arr[row][col ++] + " "); } col --; row ++; printed += (colNum - diff); diff ++; if(printed >= eleNum) { break ; } // (width, 1) -> (width, height) for(int i=0; i<rowNum-diff; i++) { Log.logWithoutLn(arr[row ++][col] + " "); } row --; col --; printed += (rowNum-diff); if(printed >= eleNum) { break ; } // (width-1, height) -> (0, height) for(int i=0; i<colNum-diff; i++) { Log.logWithoutLn(arr[row][col --] + " "); } col ++; row--; printed += (colNum - diff ); if(printed >= eleNum) { break ; } diff ++; // (0, height-1) -> (0, 1) for(int i=0; i<rowNum-diff; i++) { Log.logWithoutLn(arr[row --][col] + " "); } row ++; col++; printed += (rowNum - diff); if(printed >= eleNum) { break ; } } } // 创建蛇形矩阵 // 思路 : 打印(0, 0) -> (width, 0) 需要打印width-diff个数字, diff随着循环而变化 // 打印(width, 0) -> (width, height) 需要打印height-diff-1个数字 // 打印(width, height) -> (0, height) 需要打印width-diff-1个数字 // 打印(0, height) -> (0, 1) 需要打印height-diff-2个数字 // 每一次循环diff + 1, 本程序 这里就直接在第一次打印 和第三次打印 将diff更新了 // 请注意 更新row, col的方式 如果你不理解的话 请画一个矩阵 试着走一下, 可以帮你理解这个逻辑 public static void generateSnakeMatrix(int[][] arr) { int diff = 0; int rowNum = arr.length, colNum = arr[0].length; int printed = 0, eleNum = arr.length * arr[0].length; int row = 0, col = 0; int cur = 0; while(true) { // (0, 0) -> (width, 0) for(int i=0; i<colNum-diff; i++) { arr[row][col ++] = (cur ++); } col --; row ++; printed += (colNum - diff); if(printed >= eleNum) { break ; } diff ++; // (width, 1) -> (width, height) for(int i=0; i<rowNum-diff; i++) { arr[row ++][col] = (cur ++); } row --; col --; printed += (rowNum-diff); if(printed >= eleNum) { break ; } // (width-1, height) -> (0, height) for(int i=0; i<colNum-diff; i++) { arr[row][col --] = (cur ++); } col ++; row--; printed += (colNum - diff ); if(printed >= eleNum) { break ; } diff ++; // (0, height-1) -> (0, 1) for(int i=0; i<rowNum-diff; i++) { arr[row --][col] = (cur ++); } row ++; col++; printed += (rowNum - diff); if(printed >= eleNum) { break ; } } } // 生成一个height个元素的, 每一个元素width个int的int[][] private static int[][] generateTwoDimenArr(int width, int height) { int[][] res = new int[height][width]; int cnt = 0; for(int row=0; row<height; row++) { for(int col=0; col<width; col++) { res[row][col] = cnt++; } } return res; }}
效果截图
总结
这个题目很常见, 也不是很难, 但是 我的思路的代码似乎看着有些冗杂
注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!
0 0
- 12 蛇形打印矩阵中的数据
- C++ 打印蛇形矩阵
- Java打印蛇形矩阵
- 打印输出蛇形矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵-题解
- [腾讯]打印蛇形矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵
- 蛇形打印矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵
- 打印蛇形矩阵
- 20.蛇形矩阵打印
- 不用数组打印蛇形矩阵
- 使用包含预定义动作的隐式Intent
- Sicily 1500. Prime Gap
- C++入门(12):高级OOP技术:重载操作符、多继承和虚继承
- SpringMVC在做静态资源映射的时候需要注意的问题
- 注解
- 12 蛇形打印矩阵中的数据
- Algorithm Intro - Quick Sort
- 将自己的rest web app 从内网发布到外网
- 自定义SSLSocketFactory
- C++中的new/delete运算符与operator new/operator delete函数
- hdoj 3642 Get The Treasury 【线段树 扫描线 求立方体积交】
- MySQL优化
- python numpy:1 numpy.array和numpy.matrix常用函数使用
- Linux time()函数解析