剑指offer---1、顺时针打印矩阵

一、总结

一句话总结:

谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做
问题就这些问题:解决了就好了,比如php多维数组
面试的时候最重要的是刷编程题:因为一定会考到:那些人也是通过编程题知道你的编程水平的

1、自己的思路的不足之处?

1、矩形的编程表示:没有想到正方形(或矩形)在编程中只用 左下角和右下角 两个点即可表示
2、打印结束条件:因为正方形的表示没想好,也没想好 打印结束的判断条件:
3、不必用 访问 辅助数组:因为确定好两点表示矩阵的话就不必访问数组
  1. int left = 0, top = 0, right = col - 1, bottom = row - 1;
  2. while (left <= right && top <= bottom)
  3.  
  4. 自己的思路是怎样的
  5. 必然四种操作:
  6. 右、下、左、上
  7. 每种操作,必然都有起点和终点
  8. 这四种操作的顺序必为:右、下、左、上
  9. 用变量记录这四种操作的起点和终点
  10.  
  11. 初始
  12. right[1,每一行的长度]
  13. down[1,每一列的长度]
  14. left[每一行的长度,1]
  15. up[每一列的长度,1]
  16.  
  17. 访问之后,起点和终点都加1
  18. 结束条件是 起点大于终点
  19.  
  20. 每个点记录被访问了没有,没有被访问的话我们才访问它
  21.  
  22. 伪代码
  23. 1、复制数组:做是否访问的数组
  24. 2、按 右、下、左、上 的顺序访问数组

2、正方形(或矩形)在编程中怎么表示?

四个变量:记录左下角这个点和记录右下角这个点即可
完全不需要设置四个方向上的起点和终点:因为行变化了,你不好取数据
  1. int left = 0, top = 0, right = col - 1, bottom = row - 1;

3、php如何将数组中的元素全置为1?

空数组+两重foreach赋值的方式
  1. $matrix1=[];
  2. foreach($matrix as $key1=>$val1){
  3. foreach($val1 as $key2=>$val2){
  4. $matrix1[$key1][$key2]=1;
  5. }
  6. }

4、php中的2维数组是怎么存的?

中括号里面套中括号:数组中套数组
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [0] => 1
  6. [1] => 2
  7. [2] => 3
  8. [3] => 4
  9. )
  10.  
  11. [1] => Array
  12. (
  13. [0] => 5
  14. [1] => 6
  15. [2] => 7
  16. [3] => 8
  17. )
  18.  
  19. [2] => Array
  20. (
  21. [0] => 9
  22. [1] => 10
  23. [2] => 11
  24. [3] => 12
  25. )
  26.  
  27. [3] => Array
  28. (
  29. [0] => 13
  30. [1] => 14
  31. [2] => 15
  32. [3] => 16
  33. )
  34.  
  35. )

5、php中的多维数组怎么定义?

中括号:$matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]];

6、php如何遍历多维数组?

两重foreach
  1. $a=array('fruits'=>array('a'=>'orange','b'=>'grape','c'=>'apple'),
  2. 'numbers'=>array(1,2,3,4,5,6),
  3. 'holes'=>array('first',5=>'second','third')
  4. );
  5.  
  6. foreach($a as $v ){
  7. foreach($v as $value ){
  8. echo $value,"<br/>";
  9. }
  10. }

7、如何求二维矩阵行和列元素的数量(元素:element)?

列元素的数量:求这个矩阵中的元素的个数:$lie_element_num=count($matrix);
行元素的数量:求第一行的元素个数:$hang_element_num=count($matrix[0]);

8、我设置 右、下、左、上 四个方向上的起点和终点 这样的方式的不好之处是什么?

1、比如:这样不好从第一次右打印过渡到第二次右打印,因为行变化了,你不好取数据
2、变量的冗余:这里面很多的方向的起点终点都是冗余的

9、打印矩阵的时候的判断条件怎么确定?

1、int left = 0, top = 0, right = col - 1, bottom = row - 1;// 定义四个关键变量,表示左上和右下的打印范围
2、左不大于右,上不大于下:while (left <= right && top <= bottom)

10、顺时针打印矩阵 参考代码?

思想:用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
  1. /*
  2. 思想,用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
  3. 提交代码时,主要的问题出在没有控制好后两个for循环,需要加入条件判断,防止出现单行或者单列的情况。
  4. */
  5. class Solution {
  6. public:
  7. vector<int> printMatrix(vector<vector<int> > matrix) {
  8. int row = matrix.size();
  9. int col = matrix[0].size();
  10. vector<int> res;
  11.  
  12. // 输入的二维数组非法,返回空的数组
  13. if (row == 0 || col == 0) return res;
  14.  
  15. // 定义四个关键变量,表示左上和右下的打印范围
  16. int left = 0, top = 0, right = col - 1, bottom = row - 1;
  17. while (left <= right && top <= bottom)
  18. {
  19. // left to right
  20. for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]);
  21. // top to bottom
  22. for (int i = top + 1; i <= bottom; ++i) res.push_back(matrix[i][right]);
  23. // right to left
  24. if (top != bottom)
  25. for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]);
  26. // bottom to top
  27. if (left != right)
  28. for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]);
  29. left++,top++,right--,bottom--;
  30. }
  31. return res;
  32. }
  33. };

11、如何解决打印的是矩形而不是正方形的问题?

1、对(top != bottom)和(left != right)进行特判:避免重复输出
2、访问 辅助数组
  1. if (top != bottom)
  2. for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]);
  3. // bottom to top
  4. if (left != right)
  5. for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]);

12、注意在线敲代码的函数里面是return,比如牛客网?

函数里面是return,而不是打印变量

13、矩形的问题要注意的是什么?

矩形不是正方形

二、内容在总结中

1、题目描述

  1. 1 2 3 4
  2. 5 6 7 8
  3. 9 10 11 12
  4. 13 14 15 16

题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

 

2、代码

  1. /*
  2. 思想,用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
  3. 提交代码时,主要的问题出在没有控制好后两个for循环,需要加入条件判断,防止出现单行或者单列的情况。
  4. */
  5. class Solution {
  6. public:
  7. vector<int> printMatrix(vector<vector<int> > matrix) {
  8. int row = matrix.size();
  9. int col = matrix[0].size();
  10. vector<int> res;
  11.  
  12. // 输入的二维数组非法,返回空的数组
  13. if (row == 0 || col == 0) return res;
  14.  
  15. // 定义四个关键变量,表示左上和右下的打印范围
  16. int left = 0, top = 0, right = col - 1, bottom = row - 1;
  17. while (left <= right && top <= bottom)
  18. {
  19. // left to right
  20. for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]);
  21. // top to bottom
  22. for (int i = top + 1; i <= bottom; ++i) res.push_back(matrix[i][right]);
  23. // right to left
  24. if (top != bottom)
  25. for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]);
  26. // bottom to top
  27. if (left != right)
  28. for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]);
  29. left++,top++,right--,bottom--;
  30. }
  31. return res;
  32. }
  33. };

php代码

  1. <?php
  2.  
  3. //用访问数组解决:不是正方形而是矩形的问题
  4. function printMatrix($matrix)
  5. {
  6. $vis=$matrix;
  7. foreach ($matrix as $k=>$v){
  8. foreach ($v as $k1=>$v1){
  9. $vis[$k][$k1]=-1;
  10. }
  11. }
  12. // write code here
  13. $hang_ele_num=count($matrix[0]);
  14. $lie_ele_num=count($matrix);
  15. $a_x=0;$a_y=0;$b_x=$hang_ele_num-1;$b_y=$lie_ele_num-1;
  16. $ans=[];
  17. while($a_x<=$b_x&&$a_y<=$b_y){
  18. //依次打印右下左上
  19. for($i=$a_x;$i<=$b_x;$i++){
  20. if($vis[$a_y][$i]==-1){
  21. $ans[]=$matrix[$a_y][$i];
  22. $vis[$a_y][$i]=1;
  23. }
  24. }
  25.  
  26. for($i=$a_y+1;$i<=$b_y;$i++){
  27. if($vis[$i][$b_x]==-1){
  28. $ans[]=$matrix[$i][$b_x];
  29. $vis[$i][$b_x]=1;
  30. }
  31.  
  32. }
  33.  
  34. for($i=$b_x-1;$i>=$a_x;$i--){
  35. if($vis[$b_y][$i]==-1){
  36. $ans[]=$matrix[$b_y][$i];
  37. $vis[$b_y][$i]=1;
  38. }
  39. }
  40. for($i=$b_y-1;$i>=$a_y+1;$i--){
  41. if($vis[$i][$a_x]==-1){
  42. $ans[]=$matrix[$i][$a_x];
  43. $vis[$i][$a_x]=1;
  44. }
  45. }
  46. $a_x++;$a_y++;$b_x--;$b_y--;
  47. }
  48. return $ans;
  49. }
 

剑指offer---1、顺时针打印矩阵的更多相关文章

  1. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

  2. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

  3. 剑指 Offer 29. 顺时针打印矩阵

    剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...

  4. 力扣 - 剑指 Offer 29. 顺时针打印矩阵

    题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...

  5. 【剑指Offer】顺时针打印矩阵 解题报告(Python)

    [剑指Offer]顺时针打印矩阵 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  6. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  7. 剑指offer得意之作——顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3 ...

  8. 【Java】 剑指offer(29) 顺时针打印矩阵

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思 ...

  9. Go语言实现:【剑指offer】顺时针打印矩阵

    该题目来源于牛客网<剑指offer>专题. 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下4 X 4矩阵:1 2 3 4 5 6 7 8 9 10 11 ...

  10. 剑指offer——29顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

随机推荐

  1. zabbix历史数据全部清楚

    #这种方法会出现 监控项不可用的情况 1.停掉zabbix_server 2.重重名表 RENAME TABLE history to history_20180117; RENAME TABLE h ...

  2. 【Shiro】六、Apache Shiro Session管理

    1.Session的介绍 关于Session 会话:从启动一个Session到关闭这个Session作为一个会话,是对客户端和服务器端交互的一种封装,带有时效性 会话的产生: 一般从容器中产生 Web ...

  3. centos 安装 Lamp(Linux + Apache + PHP) 并安装 phpmyadmin

    来源:http://www.laozhe.net/302.html 一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论.从最基础的开始,一点点完成一个可用的 Linu ...

  4. Mybatis笔记 - SQL标签方法

    Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...

  5. NtCallbackReturn是否导致了用户态栈的不平衡

    0:000> u ntdll!KiFastSystemCall ntdll!KiFastSystemCall: 7c92eb8b 8bd4 mov edx,esp 7c92eb8d 0f34 s ...

  6. qrcode-使用

    安装 composer require endroid/qrcode namespace App\Http\Controllers\Admin; use Endroid\QrCode\QrCode; ...

  7. leetcode python翻转字符串里的单词

    # Leetcode 151 翻转字符串里的单词### 题目描述给定一个字符串,逐个翻转字符串中的每个单词. **示例1:** 输入: "the sky is blue" 输出: ...

  8. 20140902 字符串拷贝函数 右旋转字符串 string类的编写

    1.strncpy字符串拷贝函数 //strncpy的程序 #include<stdio.h> #include<assert.h> char *strncpy1(char * ...

  9. Emacs25.1之后UrlHttpError

    Emacs25.1之后UrlHttpError */--> pre.src {background-color: #002b36; color: #839496;} pre.src {backg ...

  10. 【目录】ASP.NET Core 2.1 入门教程

    ASP.NET Core 2.1 快速学习.入门系列教程,这个入门系列教程为了帮助大家快速上手ASP.NET Core. 本教程包含且不限于: 使用VS Code开发ASP.NET Core应用 AS ...