做题总结 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) {
            //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++;
        }
       if(n % 2 != 0) {
            matrix[n/2][n/2] = num++;
        }
        return matrix;
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android音量调节参考一

基于android 9平台分析。 在Android系统中&#xff0c;默认的设备(phone等)音量都是分开控制的&#xff0c;这些包括媒体、铃声、闹铃、蓝牙、通话通过音频流来区别不同的音量类型。每种流类型都定义最大音量、最小音量及默认音量&#xff0c;Android 9定了了11中音频流类型&am…

Shell 常用命令详解-上

Shell 常用命令详解-上 1.目录查阅相关命令2.文件操作相关命令 1.目录查阅相关命令 ll 命令 命令描述&#xff1a;ll命令用于显示指定工作目录下的内容。 命令格式&#xff1a;ll [参数] [目录名]。 参数说明&#xff1a; 参数说明-a显示所有文件及目录&#xff08;包括隐藏文…

Modelscope Agent初体验与思考

背景&#xff1a;LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了&#xff0c;ChatGPT很强大&#xff0c;但是也有做不到的东西。 例如&#xff1a; 实时查询问题&#xff1a;实时的天气&#xff0c;地理位置&#xff0c;最新新闻报道&#xff0c;现实世…

基于ssm保险业务管理系统设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本保险业务管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

手动搭建koa+ts项目框架(基础)

文章目录 前言一、TS配置文件1、全局安装TypeScript2、项目根目录创建Typescript配置文件 二、项目初始化配置文件&#xff08;package.json&#xff09;1、初始化配置文件2、安装依赖 三、开启简单的服务API入口文件新增脚本 总结如有启发&#xff0c;可点赞收藏哟~ 前言 为什…

外贸开发信主题行写法?邮件的主题怎么写?

如何写高点击率的外贸开发信主题行&#xff1f;推荐的电子邮件主题行有哪些&#xff1f; 外贸开发信如何设计一个引人注目的主题行&#xff0c;成为了外贸从业者需要深入思考的问题。在本文中&#xff0c;蜂邮将探讨外贸开发信主题行的写作方法&#xff0c;以确保您的邮件能够…

Stable Diffusion这样的文本-图像生成模型有记忆吗?

Stable Diffusion扩散模型作为生成高质量图像的先进模型&#xff0c;却伴随着对训练数据的记忆化倾向&#xff0c;引发了隐私和安全性的担忧。AIGCer分享一篇分析该现象的文章&#xff0c;通过两个案例研究深入挖掘了文本复制现象&#xff0c;旨在为未来生成模型的改进提供重要…

调试备忘录-NTC电阻的使用(教程 + 代码)

软件环境&#xff1a;CodeWarrior 11.1 硬件环境&#xff1a;NXP S9KEAZ64A 传感器参数&#xff1a;NTC热敏电阻(R25 50k,B25-50 3950) 写在前面 最近做小项目需要用到NTC电阻&#xff0c;因此写一个调试备忘录记录下。 什么是NTC电阻&#xff1f; NTC热敏电阻就是负温度…

【CiteSpace】引文可视化分析软件CiteSpace下载与安装

CiteSpace 译“引文空间”&#xff0c;是一款着眼于分析科学分析中蕴含的潜在知识&#xff0c;是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。由于是通过可视化的手段来呈现科学知识的结构、规律和分布情况&#xff0c;因此也将通过此类方法分析得到的可…

JMS(Java Message Service)使用指南

介绍 JMS即Java消息服务&#xff08;Java Message Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面向消息中间件&#xff08;MOM&#xff09;的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。它是一…

1631. 最小体力消耗路径

一、题目 1、题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) &#xff0c;且你希望去最右下角的格子 (rows-1, columns-1) &#xff08;注意…

分布式事务Seata(别名Seta)(持续学习中)

1.为什么学习他? 当一台机器的时候,只需要本地事务回滚就好了,还有MonogoDB最好不要放敏感数据,特别是旧的版本,没有事务功能(ACID), 分布式事务,也是属于多线程问题,就是把多台机器变成一台机器(他拥有更多线程,但是也要考虑网络问题),redis在一台机器是单线程的,但是多台机器…

Playground v2:a new leap in creativity

https://huggingface.co/playgroundai/playground-v2-1024px-aesthetichttps://huggingface.co/playgroundai/playground-v2-1024px-aestheticPlayground v2&#xff1a;超越SDXL的模型来了 - 知乎Playground团队刚刚发布了新的文生图模型Playground v2&#xff0c;它是基于SDX…

基于MyBatis二级缓存深入装饰器模式

视频地址 学习文档 文章目录 一、示意代码二、装饰器三、经典案例—MyBatis二级缓存1、Cache 标准定义2、PerpetualCache 基础实现3、增强实现3-1、ScheduledCache3-2、LruCache 先来说说我对装饰器理解&#xff1a;当你有一个基础功能的代码&#xff0c;但你想在不改变原来代…

案例027:基于微信小程序的校园二手平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【Docker】进阶之路:(二)Docker简介

【Docker】进阶之路&#xff1a;&#xff08;二&#xff09;Docker简介 什么是 DockerDocker 由来与发展历程Docker的架构与组成Docker容器生态容器核心技术容器规范容器平台技术 为什么使用DockerDocker的应用场景 什么是 Docker 简单地讲&#xff0c;Docker就是一个应用容器…

面向对象类的设计和实现

实验目标 本实验任务是实现 Java 类的设计和实现&#xff0c;实验任务是根据每年新生的报到流程&#xff0c; 设计一 个学生管理系统&#xff0c;实现学生的注册和报到功能。设置类的基本属性&#xff0c;实现 getter 和 setter 方 法&#xff0c;通过 set 方法设置…

C++新经典模板与泛型编程:SFINAE特性的信息萃取

用成员函数重载实现is_default_constructible 首先介绍一个C标准库提供的可变参类模板std::is_default_constructible。这个类模板的主要功能是判断一个类的对象是否能被默认构造&#xff08;所谓默认构造&#xff0c;就是构造一个类对象时&#xff0c;不需要给该类的构造函数…

三层交换原理

三层交换机出现的背景 早期的网络中一般使用二层交换机来搭建局域网&#xff0c;而不同局域网之间的网络互通由路由器来完成。那时的网络流量&#xff0c;局域网内部的流量占了绝大部分&#xff0c;而网络间的通信访问量比较少&#xff0c;使用少量路由器已经足够应付了。 但…

六级高频词汇3

目录 单词 参考链接 单词 400. nonsense n. 胡说&#xff0c;冒失的行动 401. nuclear a. 核子的&#xff0c;核能的 402. nucleus n. 核 403. retail n. /v. /ad. 零售 404. retain vt. 保留&#xff0c;保持 405. restrict vt. 限制&#xff0c;约束 406. sponsor n. …