螺旋数字矩阵 - 华为OD统一考试
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++

题目描述
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:
给出数字个数n和行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3…n,最终形成一个m行矩阵。
小明对这个矩阵有些要求:
- 每行数字的个数一样多
- 列的数量尽可能少
- 填充数字时优先填充外部
- 数字不够时,使用单个*号占位
输入描述
两个整数,空格隔开,依次表示n、m
输出描述
符合要求的唯一矩阵
示例1
输入:
9 4输出:
1 2 3
* * 4
9 * 5
8 7 6说明:
9个数字写成4行,最少需要3列
示例2
输入:
3 5输出:
1
2
3
*
*说明:
3个数字写5行,只有一列,数字不够用*号填充
题解
这是一个模拟题,主要考察对矩阵的遍历和填充的能力。
- 首先,通过输入获取数字个数n和行数m。
- 计算矩阵的列数cols,根据题意,最少需要的列数是(n-1) / m + 1。
- 初始化一个大小为m行cols列的矩阵,所有元素初始值为"*"。
- 使用四个变量top、bottom、left、right来表示当前矩阵的上下左右边界。
- 使用cur变量表示当前要填充的数字,从1开始。
- 进入循环,按照顺时针螺旋的方式依次填充矩阵的数字。
- 从左到右:遍历当前行的左右范围,依次填充数字。
- 从上到下:遍历当前列的上下范围,依次填充数字。
- 从右到左:遍历当前行的右左范围,依次填充数字。
- 从下到上:遍历当前列的下上范围,依次填充数字。
- 在每次填充后,更新相应的边界。
- 循环直到所有数字都填充完毕。
- 最后,输出填充好的矩阵。
这样,通过模拟顺时针螺旋填充的过程,就能得到符合要求的矩阵。
Java
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.Collectors;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt(), m = in.nextInt();int rows = m, cols = (n - 1) / m + 1;// grid[i][j] == 0 则认为数字不够为 *int[][] grid = new int[rows][cols];// 上下左右,四侧的边界int top = 0, bottom = rows - 1, left = 0, right = cols - 1;int cur = 1;while (cur <= n) {// 从左到右for (int i = left; i <= right && cur <= n; i++) {grid[top][i] = cur++;}if (++top > bottom) break; // 收缩范围// 从上到下for (int i = top; i <= bottom && cur <= n; i++) {grid[i][right] = cur++;}if (--right < left) break; // 收缩范围// 从右到左for (int i = right; i >= left && cur <= n; i--) {grid[bottom][i] = cur++;}if (--bottom < top) break; // 收缩范围// 从下到上for (int i = bottom; i >= top && cur <= n; i--) {grid[i][left] = cur++;}if (++left > right) break; // 收缩范围}// 输出结果Arrays.stream(grid).map(row -> Arrays.stream(row).mapToObj(num -> num == 0 ? "*" : String.valueOf(num)).collect(Collectors.joining(" "))).forEach(System.out::println);}
}
Python
n, m = map(int, input().split())# 计算需要的列数 cols
rows, cols = m, (n - 1) // m + 1# 初始化矩阵所有值为*
grid = [['*'] * cols for _ in range(rows)]# 上下左右,四侧的边界
top, bottom, left, right = 0, rows - 1, 0, cols - 1cur = 1
while True:# 从左到右for i in range(left, right + 1):if cur <= n:grid[top][i] = curcur += 1top += 1 # 收缩范围if top > bottom: break# 从上到下for i in range(top, bottom + 1):if cur <= n:grid[i][right] = curcur += 1right -= 1 # 收缩范围if right < left: break# 从右到左for i in range(right, left - 1, -1):if cur <= n:grid[bottom][i] = curcur += 1bottom -= 1 # 收缩范围if bottom < top: break# 从下到上for i in range(bottom, top-1, -1):if cur <= n:grid[i][left] = curcur += 1left += 1 # 收缩范围if left > right: breakfor row in grid:print(" ".join(map(str, row)))
C++
#include <iostream>
#include <vector>using namespace std;int main() {int n, m;cin >> n >> m;int rows = m, cols = (n - 1) / m + 1;// grid[i][j] == 0 则认为数字不够为 *vector<vector<int>> grid(rows, vector<int>(cols, 0));// 上下左右,四侧的边界int top = 0, bottom = rows - 1, left = 0, right = cols - 1;int cur = 1;while (cur <= n) {// 从左到右for (int i = left; i <= right && cur <= n; i++) {grid[top][i] = cur++;}if (++top > bottom) break; // 收缩范围// 从上到下for (int i = top; i <= bottom && cur <= n; i++) {grid[i][right] = cur++;}if (--right < left) break; // 收缩范围// 从右到左for (int i = right; i >= left && cur <= n; i--) {grid[bottom][i] = cur++;}if (--bottom < top) break; // 收缩范围// 从下到上for (int i = bottom; i >= top && cur <= n; i--) {grid[i][left] = cur++;}if (++left > right) break; // 收缩范围}// 输出结果for (const auto &row : grid) {for (size_t i = 0; i < row.size(); ++i) {if (row[i] == 0) {cout << "*";} else {cout << row[i];}if (i + 1 != row.size()) cout << " ";else cout << endl;}}return 0;
}
相关练习题
| 题号 | 题目 | 难易 |
|---|---|---|
| LeetCode 54 | 54. 螺旋矩阵 | 中等 |
| LeetCode LCR 146 | LCR 146. 螺旋遍历二维数组 | 中等 |
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
相关文章:
螺旋数字矩阵 - 华为OD统一考试
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m (0 < n < 999,…...
更改ERPNEXT源
更改ERPNEXT源 一, 更改源 针对已经安装了erpnext的,需要更改源的情况: 1, 更改为官方默认源, 进入frapp-bench的目录, 然后执行: bench remote-reset-url frappe //重设frappe的源为官方github地址。 bench remote-reset-url…...
配置基本QinQ示例
QinQ简介 定义 QinQ(802.1Q-in-802.1Q)技术是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能,可以使私网VLAN透传公网。由于在骨干网中传递的报文有两层802.1Q Tag&#x…...
界面控件DevExpress Blazor Grid v23.2 - 支持全新的单元格编辑模式
DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 在这篇文章中,我们将介…...
深入剖析pcap中的网络异常:TTL过期攻击、ARP中毒、TCP重传与重叠碎片等
网络流量数据包捕获是网络安全领域的重要部分,而pcap文件则是这一过程的常见载体。为了深入解析pcap文件中潜在的可疑网络流量,我们需要运用强大的网络安全威胁评估与审计工具。这些工具能够帮助我们捕捉、记录、检测和诊断网络中的数据传输问题…...
网站被挂黑链怎么办
网站被挂黑链这种事情总是防不胜防,且不说网站本身的安全防护做的是否到位,但只要被盯上了就难逃厄运。即使是企业机构的网站也难逃被黑的经历,更何况用户苦心经营的网站,因此首先需要正确看待挂黑链这个现象,网站被挂…...
WPF 导航界面悬浮两行之间的卡片 漂亮的卡片导航界面 WPF漂亮渐变颜色 WPF漂亮导航头界面 UniformGrid漂亮展现
在现代应用程序设计中,一个漂亮的WPF导航界面不仅为用户提供视觉上的享受,更对提升用户体验、增强功能可发现性和应用整体效率起到至关重要的作用。以下是对WPF漂亮导航界面重要性的详尽介绍: 首先,引人入胜的首页界面是用户与软…...
[技术杂谈]使用VLC将视频转成一个可循环rtsp流
通过vlc播放器,将一个视频转成rtsp流,搭建一个rtsp服务器。rtsp客户端可访问这个视频的rtsp流。 1. 打开vlc播放器,使用的版本如下 2. 菜单:媒体 ---> 流 3. 添加视频文件,点击添加一个mp4 文件 4. 选择串流&…...
手机上连网络转接app,电脑连接手机,共用网络转接app的办法
方法一,(不推荐) 因为太简单了所以写一下 电脑安装MuMu模拟器,之后安装网络转接app,这个模拟器设置了从电脑上安装app和,安卓与电脑同步文件夹功能,实现文件共享。所以直接用就可以了。 方法二…...
k8s中的容器探针
pod的容器健康检查---探针 probe:k8s对容器执行的定期检查,诊断。 探针的三种规则 所有的探针都是针对容器不是针对pod 1、 存活探针---livenessProbe:探测容器是否正常运行。如果发现探测失败,会杀掉容器。容器会根据重启策略…...
4.6 BOUNDARY CHECKS
我们现在扩展了tile矩阵乘法内核,以处理具有任意宽度的矩阵。扩展必须允许内核正确处理宽度不是tile宽度倍数的矩阵。通过更改图4.14中的示例至33 M、N和P矩阵,图4.18创建了矩阵的宽度为3,不是tile宽度(2)的倍数。图4.…...
Java集合-LinkedList
Java集合-LinkedList 特性 public class LinkedList<E> extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable1、继承于 AbstractSequentialList ,本质上面与继承 AbstractList 没有什么区别…...
2023年阿里云云栖大会:前沿技术发布与未来展望
在2023年的阿里云云栖大会上,我见证了云计算和人工智能领域的又一历史性时刻。这次大会不仅是对未来科技趋势的一次深入探索,更是阿里云技术实力和创新能力的集中展示。 首先,千亿级参数规模的大模型通义千问2.0的发布,无疑将人工…...
houdini microscope
【英文原版-无字幕】Wavelets: a mathematical microscope 小波变换最好的入门教程了吧!_哔哩哔哩_bilibili 只涉及模拟,不模拟具体对错...
Linux_CentOS_7.9配置时区及NTPdate同步之简易记录
前言:ntpdate命令来自英文词组”NTPdate“的拼写,其功能是用于设置日期和时间。ntpdate命令能够基于NTP协议设置Linux系统的本地日期和时间,利用NTP服务的时钟过滤器来选择最优方案,大大提高了可靠性和精度,让系统时间…...
十九:爬虫最终篇-平安银行商城实战
平安银行商场实战 需求 获取该商城商品信息 目标网址 https://m.yqb.com/bank/product-item-50301196.html?mcId1583912328849970&loginModepab&historyy&sceneModem&traceid30187_4dXJVel1iop详细步骤 1、寻找数据接口 2、对比payload寻找可疑参数 3、多…...
解决vcruntime140_1.dll无法继续执行代码的方法,一键修复dll文件丢失问题。
vcruntime140_1.dll是Windows操作系统中的一个重要的动态链接库文件,它与Microsoft Visual C Redistributable相关联。电脑出现关于vcruntime140_1.dll无法继续执行代码的错误弹窗是就意味着这个文件在电脑中被破坏导致丢失了,这将会影响一些程序不能正常…...
Elasticsearch:结合 ELSER 和 BM25 文本查询的相关搜索
Elastic Learned Spare EncodeR (ELSER) 允许你执行语义搜索以获得更相关的搜索结果。 然而,有时,将语义搜索结果与常规关键字搜索结果相结合以获得最佳结果会更有用。 问题是,如何结合文本和语义搜索结果? 首先,让我…...
海外社媒运营为什么需要选择优质IP代理?
跨境电商卖家尤其需要关注海外社媒运营,想要更好地运营Instagram、Facebook、TikTok 或 Twitter等,挖掘社媒潜力需要采取战略方法,而社交媒体IP代理在这一活动中发挥着至关重要的作用,下面为你详细介绍。 一、社交媒体代理IP及其运…...
Java中的性能优化:深入剖析常见优化技巧
引言 在现代软件开发中,性能优化是一个至关重要的话题。Java作为一门强大而广泛使用的编程语言,也需要开发者关注和优化性能,以确保应用程序能够在各种场景下高效运行。本文将深入剖析Java中的一些常见性能优化技巧,为开发者提供…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
