剑指offer---1、顺时针打印矩阵
剑指offer---1、顺时针打印矩阵
一、总结
一句话总结:
谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做
问题就这些问题:解决了就好了,比如php多维数组
面试的时候最重要的是刷编程题:因为一定会考到:那些人也是通过编程题知道你的编程水平的
1、自己的思路的不足之处?
1、矩形的编程表示:没有想到正方形(或矩形)在编程中只用 左下角和右下角 两个点即可表示
2、打印结束条件:因为正方形的表示没想好,也没想好 打印结束的判断条件:
3、不必用 访问 辅助数组:因为确定好两点表示矩阵的话就不必访问数组
int left = 0, top = 0, right = col - 1, bottom = row - 1;
while (left <= right && top <= bottom) 自己的思路是怎样的
必然四种操作:
右、下、左、上
每种操作,必然都有起点和终点
这四种操作的顺序必为:右、下、左、上
用变量记录这四种操作的起点和终点 初始
right[1,每一行的长度]
down[1,每一列的长度]
left[每一行的长度,1]
up[每一列的长度,1] 访问之后,起点和终点都加1
结束条件是 起点大于终点 每个点记录被访问了没有,没有被访问的话我们才访问它 伪代码
1、复制数组:做是否访问的数组
2、按 右、下、左、上 的顺序访问数组
2、正方形(或矩形)在编程中怎么表示?
四个变量:记录左下角这个点和记录右下角这个点即可
完全不需要设置四个方向上的起点和终点:因为行变化了,你不好取数据
int left = 0, top = 0, right = col - 1, bottom = row - 1;
3、php如何将数组中的元素全置为1?
空数组+两重foreach赋值的方式
$matrix1=[];
foreach($matrix as $key1=>$val1){
foreach($val1 as $key2=>$val2){
$matrix1[$key1][$key2]=1;
}
}
4、php中的2维数组是怎么存的?
中括号里面套中括号:数组中套数组
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
) [1] => Array
(
[0] => 5
[1] => 6
[2] => 7
[3] => 8
) [2] => Array
(
[0] => 9
[1] => 10
[2] => 11
[3] => 12
) [3] => Array
(
[0] => 13
[1] => 14
[2] => 15
[3] => 16
) )
5、php中的多维数组怎么定义?
中括号:$matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]];
6、php如何遍历多维数组?
两重foreach
$a=array('fruits'=>array('a'=>'orange','b'=>'grape','c'=>'apple'),
'numbers'=>array(1,2,3,4,5,6),
'holes'=>array('first',5=>'second','third')
); foreach($a as $v ){
foreach($v as $value ){
echo $value,"<br/>";
}
}
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、顺时针打印矩阵 参考代码?
思想:用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
/*
思想,用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
提交代码时,主要的问题出在没有控制好后两个for循环,需要加入条件判断,防止出现单行或者单列的情况。
*/
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int row = matrix.size();
int col = matrix[0].size();
vector<int> res; // 输入的二维数组非法,返回空的数组
if (row == 0 || col == 0) return res; // 定义四个关键变量,表示左上和右下的打印范围
int left = 0, top = 0, right = col - 1, bottom = row - 1;
while (left <= right && top <= bottom)
{
// left to right
for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]);
// top to bottom
for (int i = top + 1; i <= bottom; ++i) res.push_back(matrix[i][right]);
// right to left
if (top != bottom)
for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]);
// bottom to top
if (left != right)
for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]);
left++,top++,right--,bottom--;
}
return res;
}
};
11、如何解决打印的是矩形而不是正方形的问题?
1、对(top != bottom)和(left != right)进行特判:避免重复输出
2、访问 辅助数组
if (top != bottom)
for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]);
// bottom to top
if (left != right)
for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]);
12、注意在线敲代码的函数里面是return,比如牛客网?
函数里面是return,而不是打印变量
13、矩形的问题要注意的是什么?
矩形不是正方形
二、内容在总结中
1、题目描述
1 2 3 4
5 6 7 8
9 10 11 12
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、代码
/*
思想,用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
提交代码时,主要的问题出在没有控制好后两个for循环,需要加入条件判断,防止出现单行或者单列的情况。
*/
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int row = matrix.size();
int col = matrix[0].size();
vector<int> res; // 输入的二维数组非法,返回空的数组
if (row == 0 || col == 0) return res; // 定义四个关键变量,表示左上和右下的打印范围
int left = 0, top = 0, right = col - 1, bottom = row - 1;
while (left <= right && top <= bottom)
{
// left to right
for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]);
// top to bottom
for (int i = top + 1; i <= bottom; ++i) res.push_back(matrix[i][right]);
// right to left
if (top != bottom)
for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]);
// bottom to top
if (left != right)
for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]);
left++,top++,right--,bottom--;
}
return res;
}
};
php代码
<?php //用访问数组解决:不是正方形而是矩形的问题
function printMatrix($matrix)
{
$vis=$matrix;
foreach ($matrix as $k=>$v){
foreach ($v as $k1=>$v1){
$vis[$k][$k1]=-1;
}
}
// write code here
$hang_ele_num=count($matrix[0]);
$lie_ele_num=count($matrix);
$a_x=0;$a_y=0;$b_x=$hang_ele_num-1;$b_y=$lie_ele_num-1;
$ans=[];
while($a_x<=$b_x&&$a_y<=$b_y){
//依次打印右下左上
for($i=$a_x;$i<=$b_x;$i++){
if($vis[$a_y][$i]==-1){
$ans[]=$matrix[$a_y][$i];
$vis[$a_y][$i]=1;
}
} for($i=$a_y+1;$i<=$b_y;$i++){
if($vis[$i][$b_x]==-1){
$ans[]=$matrix[$i][$b_x];
$vis[$i][$b_x]=1;
} } for($i=$b_x-1;$i>=$a_x;$i--){
if($vis[$b_y][$i]==-1){
$ans[]=$matrix[$b_y][$i];
$vis[$b_y][$i]=1;
}
}
for($i=$b_y-1;$i>=$a_y+1;$i--){
if($vis[$i][$a_x]==-1){
$ans[]=$matrix[$i][$a_x];
$vis[$i][$a_x]=1;
}
}
$a_x++;$a_y++;$b_x--;$b_y--;
}
return $ans;
}
剑指offer---1、顺时针打印矩阵的更多相关文章
- 《剑指offer》顺时针打印矩阵
本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...
- 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...
- 剑指 Offer 29. 顺时针打印矩阵
剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...
- 力扣 - 剑指 Offer 29. 顺时针打印矩阵
题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...
- 【剑指Offer】顺时针打印矩阵 解题报告(Python)
[剑指Offer]顺时针打印矩阵 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【剑指offer】顺时针打印矩阵
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...
- 剑指offer得意之作——顺时针打印矩阵
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3 ...
- 【Java】 剑指offer(29) 顺时针打印矩阵
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思 ...
- Go语言实现:【剑指offer】顺时针打印矩阵
该题目来源于牛客网<剑指offer>专题. 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下4 X 4矩阵:1 2 3 4 5 6 7 8 9 10 11 ...
- 剑指offer——29顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
随机推荐
- [CSP-S模拟测试]:世界线(DFS+bitset)
题目描述 时间并不是一条单一的线,而是有许多世界线构成的流. 在一些时刻,世界线会发生分裂:同样的,它们也有可能在一些时刻收束在一起.如果将这些时刻抽象成点,那么这些世界线构成的网络,实际上是一张有向 ...
- jQuery函数API,各版本新特性汇总
jQuery API 速查表 选择器 基本 #id element .class * selector1,selector2,selectorN 层级 ancestor descendant pare ...
- HTML-参考手册: 画布
ylbtech-HTML-参考手册: 画布 1.返回顶部 1. HTML5 <canvas> 参考手册 描述 HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 ...
- 63、saleforce DML
PRIVELEGE__c privilege = new PRIVELEGE__c(PRIVILAGENAME__c = '权限添加',PRIVILAGEDESCRIBE__c = '权限描述'); ...
- PHP面试 MySQL的SQL语句编写
MySQL的SQL语句编写 面试题一 有A表(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50 ...
- Eureka 系列(03)Spring Cloud 自动装配原理
Eureka 系列(03)Spring Cloud 自动装配原理 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 本文主要是分析 Spring Cloud 是如何整合 Eu ...
- CentOS6.5源码安装MySQL5.6.35
CentOS6.5源码安装MySQL5.6.35 一.卸载旧版本 1.使用下面的命令检查是否安装有mysql [root@localhost tools]# rpm -qa|grep -i mysql ...
- Python面试题之“猴子补丁”(monkey patching)指的是什么?这种做法好吗?
“猴子补丁”就是指,在函数或对象已经定义之后,再去改变它们的行为. 举个例子: import datetime datetime.datetime.now = lambda: datetime.dat ...
- Centos7.6安装教程 && history设置显示执行命令的时间
一.规划磁盘使用空间(磁盘总大小200GB) /dev/sda1 mount /boot 1G mount point /dev/sda2 mount / 100G /dev/sda3 mount / ...
- android service 样例(电话录音和获取系统当前时间)
关于android service 的具体解释请參考: android四大组件--android service具体解释.以下将用两个实例具体呈现Android Service的两种实现. 一个是st ...