做题总结 59. 螺旋矩阵 II

news2024/11/24 12:45:12

跟着代码随想录顺序到这题,不会做。不知道怎么才能实现。
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;
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇

​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 HarmonyOS 4.0 技术介绍&#xff1a; HarmonyOS三大特征&#xff1a; 1.实现硬件互助&#…

【Python必做100题】之第七题(求圆的面积)

圆的面积公式&#xff1a;S pi * r * r 代码如下&#xff1a; pi 3.14 r float(input("请输入圆的半径&#xff1a;")) s pi * r * r print("圆的面积是&#xff1a;%.3f" %s) 运行结果如下&#xff1a; 总结&#xff1a; 1、圆的面积公式&#xff…

【Spring教程17】Spring框架实战:实例详解解读AOP通知类型的使用

欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》&#xff0c;本文的上一篇为《AOP配置管理中AOP切入点表…

Python:核心知识点整理大全13-笔记

目录 6.4.3 在字典中存储字典 6.5 小结 第7章 用户输入和while循环 7.1 函数 input()的工作原理 7.1.1 编写清晰的程序 7.1.2 使用 int()来获取数值输入 7.1.3 求模运算符 7.1.4 在 Python 2.7 中获取输入 7.2 while 循环简介 7.2.1 使用 while 循环 往期快速传送门…

机器学习与人工智能:一场革命性的变革

机器学习与人工智能&#xff1a;一场革命性的变革 人工智能的概述什么是机器学习定义解释 数据集结构机器学习应用场景 人工智能的概述 1956年8月&#xff0c;在美国汉诺斯小镇宁静的达特茅斯学院中&#xff0c;约翰麦卡锡&#xff08;John McCarthy&#xff09;、马文闵斯基&…

SDXL使用animateDiff和hotshot-xl进行文生视频

截至2023.12.8号&#xff0c;目前市面上有两款适用于SDXL的文生视频开源工具&#xff0c;分别是AnimateDiff和hotshot-xl。 一、工具下载链接 &#xff08;1&#xff09;AnimateDiff的webui版本的git链接&#xff1a; GitHub - continue-revolution/sd-webui-animatediff: A…

前端 usbkey navigator.usb 登录检测

前端 usbkey navigator.usb 实现登录 前言调用api 报错总结 前言 navigator.usb 是一个与USB设备交互的API&#xff0c;它允许网页和浏览器扩展程序访问连接到电脑的USB设备。这个API可以让网页直接与USB设备进行数据交换&#xff0c;而无需用户手动安装任何软件。navigator.u…

【计算机网络实验】实验三 IP网络规划与路由设计(头歌)

目录 一、知识点 二、实验任务 三、头歌测试 一、知识点 IP子网掩码的两种表示方法 32位IP子网掩码&#xff0c;特点是从高位开始连续都是1&#xff0c;后面是连续的0&#xff0c;它有以下两种表示方法&#xff1a; 传统表示法&#xff0c;如&#xff1a;255.255.255.0IP前…

四年成长总结

树叶绿了又落下&#xff0c;树叶落下又绿了……季节如此&#xff0c;时间依然。 每到快结束的时候&#xff0c;总是不免的使人伤怀起来&#xff0c;可能是昨天的昨天仍旧使人“忆”&#xff0c;明天的未知使人“追”&#xff0c;不论是昨天亦或是明天&#xff0c;“斯为泰山而…

如何进行落地的数据分析,并提出落地的分析建议?

落地的数据分析是指将数据分析结果应用到实际业务中&#xff0c;以提供有价值的决策支持和改进方案。在进行落地的数据分析前&#xff0c;需要明确分析目标和需求&#xff0c;制定合适的分析方法和步骤&#xff0c;并在分析过程中不断优化和验证分析结果。以下是进行落地的数据…

AI PC行业深度研究报告:AI PC革新端侧AI交互体验

今天分享的人工智能系列深度研究报告&#xff1a;《AI PC行业深度研究报告&#xff1a;AI PC革新端侧AI交互体验》。 &#xff08;报告出品方&#xff1a;华创证券&#xff09; 报告共计&#xff1a;28页 点击添加图片描述&#xff08;最多60个字&#xff09;编辑 一、硬件端…

爬虫 selenium语法 (八)

目录 一、为什么使用selenium 二、selenium语法——元素定位 1.根据 id 找到对象 2.根据标签属性的属性值找到对象 3.根据Xpath语句获取对象 4.根据标签名获取对象 5.使用bs语法获取对象 6.通过链接文本获取对象 三、selenium语法——访问元素信息 1.获取属性的属性值…

Leetcode—228.汇总区间【简单】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—228.汇总区间 解题思路 我们可以用双指针left 和 right找出每个区间的左右端点。 遍历数组&#xff0c;当right 1< n 且 nums[right1]nums[right]1 时&#xff0c;指针right向右移动&#xff0c;否则区间 [left, …

15:00面试,15:06就出来了,问的问题太变态了。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…

成都工业学院Web技术基础(WEB)实验八:BOM、DOM基本操作

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

c2-C语言--指针

1.用一级指针遍历一维数组 结论 buf[i]<>*(buf i) <> *(p i)<> p[i] #include <stdio.h>int main(){int buf[5] {10,20 ,30 ,40,50}; //buf[0] --- int // buf --&buf[0] ----int *int *p buf;//&buf[0] --- &*(buf0)printf(&quo…

声明式数据建模、定义简单易懂:下一代 ORM 助你效率倍增 | 开源日报 No.102

prisma/prisma Stars: 34.0k License: Apache-2.0 Prisma 是一个下一代 ORM&#xff0c;包括以下工具&#xff1a; Prisma Client&#xff1a;为 Node.js 和 TypeScript 自动生成的类型安全查询构建器Prisma Migrate&#xff1a;声明式数据建模和迁移系统Prisma Studio&#…

【解刊】IEEE(trans),CCF-A,IF7.9,潜力好刊

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域高分好刊&#xff0c;CCF-A类推荐的期刊解读&#xff0c;如您有投稿需求&#xff0c;可作为重点关注&#xff01;后文有相关领域真实发表案例&#xff0c;供您投稿参考~ 01 期刊简介 IEEE Transactions on Mobile Compu…

科研试剂2913223-17-1激酶抑制剂 KWCN-41

KWCN-41 激酶抑制剂 2913223-17-1&#xff08;源自星戈瑞&#xff09; EFdA-TP 核苷逆转录酶抑制剂 950913-56-1 (RT) 3-O-Methylviridicatin TNF-α的抑制剂 6152-57-4 Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9 Triacsin C 酰基辅酶A合成酶抑制剂 76896-80…

【lesson4】数据类型之数值类型

文章目录 数据分类数值类型tinyint类型有符号类型测试无符号类型测试 bit类型测试 float类型有符号测试无符号测试 decimal类型测试 数据分类 数值类型 tinyint类型 说明&#xff1a;tinyint 有符号能存储的范围是-128-127&#xff0c;无符号能存储的范围是0~255 有符号类型…