做题总结 59. 螺旋矩阵 II

跟着代码随想录顺序到这题,不会做。不知道怎么才能实现。
PS:我是用 java实现的。

题目:给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

总结思路为:

二维数组实现+保存结果。顺时针处理,看作处理四条边,四个for循环。
注意边界问题。

实现代码的时候犯的错:

(1)没有返回值

添加 return matrix;

(2)四周绕一圈处理值之后,n为奇数的时候最中间的值没有处理。

跳出循环后:

if(n % 2 == 1) {//奇数条件的限制matrix[start][start] = num++;
}

这里要添加奇数条件的限制。如果没有 if 条件,当n为偶数时也会改变值。

(3)循环次数出错

分析:n=3时,绕一圈即可。n=4时,绕两圈。所以循环的次数为 n/2。
但是写while循环的时候出错了,出错的原因是,忘记 自增运算符的优先级比不等号大

本来写的是 int loop = n/2; while(loop-- >= 0) 但是这样是不对的,因为会先判断是否大于等于0,然后进入循环,再对 loop进行减一操作。修改为while(--loop >= 0)

更直观一点,跟代码随想录中一样,int loop = 0; while (loop++ < n / 2) 这个的好处是,很直观看出循环次数和 n 之间的关系。加法相比减法也不容易出错。而且卡尔哥合并了 offset 和 loop的作用,是需要通过加法保持两者的一致性的。

(4)四个for循环都写错了

天哪,错误实在太多了。整个自己写的代码好像一句话都没对啊。。。
关键点在,顺时针处理的时候,顺序为 上->右->下->左,要清楚每一条边那个条件是不变的。比如处理 “上” 边的时候,它的纵坐标是不会变的!

(5)循环中处理边的 i j 是可以不变的

我是这么写的:

//top
for(int j=start; j<n-offset; j++) {matrix[start][j] = num++;
}//right
for(int i=start; i<n-offset; i++) {matrix[i][n-offset] = num++;
}//bottom
for(int j=n-offset; j>start; j--) {matrix[n-offset][j] = num++;
}//left
for(int i=n-offset; i>start; i--) {matrix[i][start] = num++;
}
offset++;
start++;

代码随想录是这么写的:

for (j = start; j < n - loop; j++) {res[start][j] = count++;
}// 模拟右侧从上到下
for (i = start; i < n - loop; i++) {res[i][j] = count++;
}// 模拟下侧从右到左
for (; j >= loop; j--) {res[i][j] = count++;
}// 模拟左侧从下到上
for (; i >= loop; i--) {res[i][j] = count++;
}
start++;

巧妙的点

① 合并了 loop 和 offset 两个变量。
② i 和 j 可以连贯使用。
第一个for (处理上侧从左到右)执行后,j++,此时 j 为 n-offset, 然后跳出循环,这个 j 是可以复用的。因为紧接着第二个 for(处理右侧从上到下),其中的 纵坐标,也就是 j 是不变的。

我提交的代码

class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int loop = n/2;int start = 0 ;int offset = 1;int num=1;while(--loop >= 0) {//topfor(int j=start; j<n-offset; j++) {matrix[start][j] = num++;}//rightfor(int i=start; i<n-offset; i++) {matrix[i][n-offset] = num++;}//bottomfor(int j=n-offset; j>start; j--) {matrix[n-offset][j] = num++;}//leftfor(int i=n-offset; i>start; i--) {matrix[i][start] = num++;}offset++;start++;}if(n % 2 != 0) {matrix[n/2][n/2] = num++;}return matrix;}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/265197.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录 | ubuntu源码编译安装/更新boost版本

一、卸载当前的版本 1、查看当前安装的boost版本 dpkg -S /usr/include/boost/version.hpp通过上面的命令&#xff0c;你就可以发现boost的版本了&#xff0c;查看结果可能如下&#xff1a; libboost1.54-dev: /usr/include/boost/version.hpp 2、删除当前安装的boost sudo …

windows搭建redis服务

windows搭建redis服务 Windows 下 Redis 安装与配置 教程 下载软件 1、下载链接 https://github.com/microsoftarchive/redis/releases 安装教程&#xff0c;查看是否生效 1、安装包如图所示 Redis-x64-3.0.504.msi 2、双击 msi 安装包 双击 msi 安装程序&#xff0c;打…

GLAB | CCNA+HCIA=融合课-最新开课通知

敲重点! 12月17日 CCNAHCIA 周日开课啦&#xff01; CCNA&#xff08;Cisco Certified Network Associate&#xff09;认证是Cisco售后工程师认证体系的入门认证&#xff0c;也是Cisco各项认证中级别最低的技术认证通过CCNA认证可证明你已掌握网络的基本知识&#xff0c;并能…

Truffle的基础语法与js测试语法

truffle编译 truffle compiletruffle部署 truffle migratetruffle测试 使用test文件夹下的所有文件测试 truffle test使用单个文件 测试 truffle test 文件所在位置assert断言 assert.equal 是一种常见的断言函数&#xff0c;用于测试两个值是否相等。它接受两个参数&…

在Asp.Net Core中启用Http响应压缩

无论是开发网站&#xff0c;还是开发Api。很多时候为了节约网络流量我们需要对请求金星压缩处理以减少消息传递过程中的资源消耗&#xff0c;并且多数情况有利于应用发挥更好的性能&#xff08;响应压缩在服务端处理&#xff0c;使用服务器资源&#xff09;。 在Asp.Net Core中…

秒级监控、精准迅速:全面保障业务可用性 | 开源日报 No.101

louislam/uptime-kuma Stars: 41.1k License: MIT Uptime Kuma 是一个易于使用的自托管监控工具&#xff0c;主要功能和核心优势包括&#xff1a; 监控 HTTP(s) / TCP / HTTP(s) 关键词 / HTTP(s) Json 查询 / Ping / DNS 记录等服务的可用性提供时尚、响应迅速且良好用户体验…

基于springboot的大学生兼职信息管理系统(源码+数据库+文档)

摘要 基于Spring Boot的大学生兼职信息管理系统是一个为大学生和兼职公司提供服务的平台。通过该系统&#xff0c;大学生可以方便地寻找兼职工作机会&#xff0c;而兼职公司可以发布、管理和筛选合适的兼职信息。首先&#xff0c;系统采用了Spring Boot作为开发框架&#xff0…

【设计模式-4.4】行为型——模板方法模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;模板方法模式&#xff1b; 生存 模版方法模式是行为型设计模式&#xff0c;关注于对象的行为。在《秒懂设计模式》&#xff08;刘韬 著&#xff09;中举了一个例子&#xff0c;例如哺乳动物的生存技能&…

MacOS 14.1 配置kerberos认证

MacOS 14.1 配置kerberos认证 MacOS 14.1 配置kerberos认证krb5.conf票据显示程序问题参考地址 MacOS 14.1 配置kerberos认证 原操作系统为 10.14.*&#xff0c;因安装别的软件失败&#xff0c;不想去找旧版本了&#xff0c;所以把OS直接升级到最新版的14.1啦&#xff0c;升级…

DevEco Studio IDE 创建项目时候配置环境

DevEco Studio IDE 创建项目时候配置环境 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、在配置向导的时候意外关闭配置界面该如何二次配置IDE环境。 打开IDE的界面是这样的。 点击Create Project进行环境配置。 点击OK后出现如…

手写线程池

文章目录 线程池最主要有两部分&#xff0c;阻塞队列和线程池&#xff0c;阻塞队列使用双端队列&#xff0c;我们需要定义队列的容量、 还需要锁来保证将任务放入队列和取出队列的正确性、使用Reentrentlock定义两个条件变量&#xff1a;生产者条件变量和消费者条件变量&#x…

系列学习前端之第 3 章:一文精通 css

全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料&#xff1a; 链接: 百度网盘 请输入提取码 提取码: 6666 一、CSS基础 1. CSS简介 CSS 的全称为&#xff1a;层叠样式表 ( Cascading Style Sheets ) 。 CSS 也是一种标记语言&#xff0c;用于给 HTML 结构设…