华为OD机试 - 螺旋数字矩阵 - 矩阵(Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:
给出数字个数n和行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3…n,最终形成一个m行矩阵。
小明对这个矩阵有些要求:
- 每行数字的个数一样多
- 列的数量尽可能少
- 填充数字时优先填充外部
- 数字不够时,使用单个*号占位
二、输入描述
两个整数,空格隔开,依次表示n、m
三、输出描述
符合要求的唯一矩阵
四、测试用例
1、输入
9 4
2、输出

3、说明
9个数字写成4行,最少需要3列
五、解题思路
- 计算列数:根据给定的数字个数n和行数m,计算最少需要的列数cols,使得每行数字个数相同,并且列数尽可能少。计算公式为cols = ceil(n / m)。
- 初始化矩阵:创建一个m x cols的矩阵,初始化所有位置为*,表示占位符。
- 螺旋填充数字:
- 使用四个指针top, bottom, left, right来定义当前的填充边界。
- 按照顺时针的顺序依次向右、向下、向左、向上填充数字。
- 每填充一个数字,数字计数器num递增。
- 当num超过n时,停止填充,剩余位置保持*。
- 输出矩阵:按照行顺序输出填充后的矩阵,每行数字之间用空格分隔。
六、Python算法源码
import mathdef spiral_matrix(n, m):# 计算需要的最少列数cols = math.ceil(n / m)# 初始化矩阵,填充'*'matrix = [['*' for _ in range(cols)] for _ in range(m)]# 螺旋填充数字num = 1top, bottom = 0, m - 1left, right = 0, cols - 1while num <= n:# 向右移动for i in range(left, right + 1):if num > n:breakmatrix[top][i] = str(num)num += 1top += 1# 向下移动for i in range(top, bottom + 1):if num > n:breakmatrix[i][right] = str(num)num += 1right -= 1# 向左移动for i in range(right, left - 1, -1):if num > n:breakmatrix[bottom][i] = str(num)num += 1bottom -= 1# 向上移动for i in range(bottom, top - 1, -1):if num > n:breakmatrix[i][left] = str(num)num += 1left += 1# 输出矩阵for row in matrix:print(' '.join(row))# 读取输入
n, m = map(int, input().split())
spiral_matrix(n, m)
七、JavaScript算法源码
function spiralMatrix(n, m) {// 计算需要的最少列数const cols = Math.ceil(n / m);// 初始化矩阵,填充'*'const matrix = Array.from({ length: m }, () => Array(cols).fill('*'));// 螺旋填充数字let num = 1;let top = 0, bottom = m - 1;let left = 0, right = cols - 1;while (num <= n) {// 向右移动for (let i = left; i <= right && num <= n; i++) {matrix[top][i] = String(num++);}top++;// 向下移动for (let i = top; i <= bottom && num <= n; i++) {matrix[i][right] = String(num++);}right--;// 向左移动for (let i = right; i >= left && num <= n; i--) {matrix[bottom][i] = String(num++);}bottom--;// 向上移动for (let i = bottom; i >= top && num <= n; i--) {matrix[i][left] = String(num++);}left++;}// 输出矩阵for (let row of matrix) {console.log(row.join(' '));}
}// 读取输入
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin', 'utf-8').trim().split(' ');
const n = parseInt(input[0]);
const m = parseInt(input[1]);
spiralMatrix(n, m);
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>int main() {int n, m;// 读取输入的n和mscanf("%d %d", &n, &m);// 计算需要的最少列数int cols = (int)ceil((double)n / m);// 动态分配二维数组,并初始化为'*'char ***matrix = (char ***)malloc(m * sizeof(char **));for(int i = 0; i < m; i++) {matrix[i] = (char **)malloc(cols * sizeof(char *));for(int j = 0; j < cols; j++) {matrix[i][j] = (char *)malloc(2 * sizeof(char));strcpy(matrix[i][j], "*");}}// 螺旋填充数字int num = 1;int top = 0, bottom = m -1;int left = 0, right = cols -1;while(num <= n) {// 向右移动for(int i = left; i <= right && num <= n; i++) {char buffer[12];sprintf(buffer, "%d", num++);strcpy(matrix[top][i], buffer);}top++;// 向下移动for(int i = top; i <= bottom && num <= n; i++) {char buffer[12];sprintf(buffer, "%d", num++);strcpy(matrix[i][right], buffer);}right--;// 向左移动for(int i = right; i >= left && num <= n; i--) {char buffer[12];sprintf(buffer, "%d", num++);strcpy(matrix[bottom][i], buffer);}bottom--;// 向上移动for(int i = bottom; i >= top && num <= n; i--) {char buffer[12];sprintf(buffer, "%d", num++);strcpy(matrix[i][left], buffer);}left++;}// 输出矩阵for(int i = 0; i < m; i++) {for(int j = 0; j < cols; j++) {if(j > 0) printf(" ");printf("%s", matrix[i][j]);}printf("\n");}// 释放内存for(int i = 0; i < m; i++) {for(int j = 0; j < cols; j++) {free(matrix[i][j]);}free(matrix[i]);}free(matrix);return 0;
}
九、C++算法源码
#include <bits/stdc++.h>
using namespace std;int main(){int n, m;// 读取输入的n和mcin >> n >> m;// 计算需要的最少列数int cols = ceil((double)n / m);// 初始化矩阵,填充'*'vector<vector<string>> matrix(m, vector<string>(cols, "*"));// 螺旋填充数字int num = 1;int top = 0, bottom = m -1;int left = 0, right = cols -1;while(num <= n){// 向右移动for(int i = left; i <= right && num <=n; i++){matrix[top][i] = to_string(num++);}top++;// 向下移动for(int i = top; i <= bottom && num <=n; i++){matrix[i][right] = to_string(num++);}right--;// 向左移动for(int i = right; i >= left && num <=n; i--){matrix[bottom][i] = to_string(num++);}bottom--;// 向上移动for(int i = bottom; i >= top && num <=n; i--){matrix[i][left] = to_string(num++);}left++;}// 输出矩阵for(int i =0; i < m; i++){for(int j=0; j < cols; j++){if(j >0) cout << " ";cout << matrix[i][j];}cout << "\n";}return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

相关文章:
华为OD机试 - 螺旋数字矩阵 - 矩阵(Python/JS/C/C++ 2024 D卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)
分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB) 目录 分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)分类效果基本介绍程序设计参考资料分类效果 基本介绍 GCN图卷积神经网络多特征分类预测(MATLAB) 在图卷积神经网络(GCN)中,多特征分类...
FPGA搭建PCIE3.0通信架构简单读写测试,基于XDMA中断模式,提供3套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博客方案的PCIE2.0版本 3、PCIE基础知识4、工程详细设计方案工程设计原理框图XDMA配置及使用XDMA中断模块数据缓存架构用户逻辑Windows版本XDMA驱动安装Linux版本XDMA驱动安装测试应用程序工程源码架构PCIE上板…...
App相关技术以及打包
平时小伙伴们自己的博客网站只能在浏览器打开,但是有时候你想要制作自己独立个人博客app,宣传并推广自己的app,打造个人ip。如何把自己的web博客网站打包成安卓app? 1.开发App的相关技术使⽤ ⽬前市⾯上的移动互联开发技术主要分…...
【unity】【游戏开发】Unity代码不给提示怎么办?
【现象】 Unity用着用着忽然VS脚本不给提示了。 【分析】 重启Unity无效 重启VS无效 重装VS无效 感觉应该是项目设置问题 【最终方法】 打开Edit->Preferences。 如果是这个画面就把Script Editor改成自己的VS编辑器。 变成下面这个样子,点击Regenerate Pr…...
Kubernetes固定Pod IP和Mac地址
方案1: 在 Calico GitHub Issues#5196 问题的 commits#6249 提交中,引入新的 Pod 注释cni.projectcalico.org/hwAddr,用于将指定的 MAC 地址分配给容器端 Veth 接口。 将Calico升级至v3.24.1或以上版本,使用如下注解轻松设置Pod…...
计算机组成原理之数据的对齐和大/小端存放方式、计算机中数据对齐的具体方式有哪些
1、计算机组成原理之数据的对齐和大/小端存放方式 数据对齐 数据对齐是处理器为了提高处理性能而对存取数据的起始地址所提出的一种要求。 系统一次性读取内存中数据的大小是固定的,例如字长为32位的操作系统,默认的一次读取4字节内容。因此ÿ…...
【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略
【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议(IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …...
【毕业论文+源码】基于SSM(Spring + Spring MVC + MyBatis)的房屋租赁系统
创建一个基于SSM(Spring Spring MVC MyBatis)框架的房屋租赁系统是一个涉及多个步骤的过程。这个过程包括但不限于需求分析、数据库设计、前端界面设计以及后端逻辑实现等。 1. 需求分析 首先,明确你的房屋租赁系统的功能需求。例如&…...
【golang】解析 JSON到指定结构体
1.解析[1,2,3,4]数组类型的json package mainimport ("encoding/json""fmt" )func main() {// JSON 数据jsonData : [1, 2, 3, 4]// 定义一个切片来接收解析后的数据var numbers []int// 解析 JSON 数据到切片err : json.Unmarshal([]byte(jsonData), &am…...
设计模式——过滤器模式
一、定义和概念 定义 C 过滤器模式(Filter Pattern)也称为标准模式(Criteria Pattern),是一种设计模式,用于根据不同的标准或条件从一组对象中筛选出符合条件的对象。它将筛选条件的逻辑封装在不同的过滤器…...
Unity(四十八):Unity与Web双向交互
效果 游戏对象绑定脚本 游戏脚本源码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Tent : MonoBehaviour {public Camera camera;// Start is called before the first frame updatevoid Start(){}// Update is called once…...
web前端--网页练习
html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小米</title><!-- 引…...
信息安全入门——网络安全控制
目录 前言信息安全入门:网络安全控制基础1. 用户识别技术:确认你是谁2. 访问控制技术:定义你能做什么3. 访问控制列表(ACL):精细的权限管理4. 漏洞控制:防范未然5. 入侵检测系统(IDS…...
跟着鸟儿学飞行?扑翼机器人的感知秘籍
大家好!今天来了解一篇扑翼机器人的研究——《Avian-inspired embodied perception in biohybrid flapping-wing robotics》发表于《Nature Communications》。在广阔天空中,鸟类凭借精妙翅膀结构与敏锐感知自由翱翔,这一直吸引着科学家探索其…...
Python画笔案例-093 绘制 彩虹图
1、绘制 彩虹图 通过 python 的turtle 库绘制 彩虹图,如下图: 2、实现代码 绘制 彩虹图,以下为实现代码: """彩虹图.py """ import turtledef draw_semi_circle(radius):"""画半圆函数"""turtle...
【数据结构】贪心算法:决策的艺术
贪心算法(Greedy Algorithm)是一类在每一步选择中都采取局部最优解的方法,希望最终能够达到全局最优解。通俗地说,贪心算法的思想就是“每一步都尽量做出最好的选择”,以期望整个过程的最终结果也达到最优状态。贪心算…...
Linux LVS详解
LVS(Linux Virtual Server)即Linux虚拟服务器,是一个基于Linux操作系统的高性能、可扩展的负载均衡器。以下是对LVS的详细介绍: 一、简介 LVS项目由章文嵩博士在1998年5月发起,是中国国内最早出现的自由软件项目之一…...
LabVIEW显微镜自动对焦系统
在生物医学研究中,显微镜图像的清晰度对于细胞分析非常重要。传统的手动对焦方法容易受到人为因素的影响,因此开发了一种自动对焦技术,以提高图像采集的准确性和效率。 自动对焦方法概述 该系统结合了图像清晰度评估和一维功能优化ÿ…...
基于IP的真实地址生成器
ip-geoaddress-generator 是一个基于 Web 的在线应用程序,能够根据 IP 地址生成真实的随机地址信息。通过多个 API 获取位置数据和随机用户信息,该工具为用户提供了完整的虚拟身份。它由 Next.js 和 Radix UI 构建,具备自动检测当前 IP 地址和…...
实战指南:如何用Mask R-CNN在iSAID数据集上提升航空影像分割效果(附调参技巧)
航空影像实例分割实战:Mask R-CNN在iSAID数据集上的调优策略 航空影像分析正逐渐成为城市规划、灾害监测和国防安全等领域的关键技术。与常规自然图像不同,这类影像通常包含大量密集分布的小目标,且目标尺度变化极大——从几个像素的小型车辆…...
利用快马平台十分钟搭建tk风格免费登录入口网站原型
今天想和大家分享一个快速搭建登录页面的小技巧。最近在做一个新项目,需要先验证登录功能的可行性,但时间比较紧,不想花太多时间在前端页面上。正好发现了InsCode(快马)平台,用它十分钟就搞定了一个tk风格的登录入口原型ÿ…...
别再只盯着顶刊了!这5本AI领域的SCI期刊,投稿友好、审稿快,适合你的第一篇论文
5本AI领域高性价比SCI期刊:避开顶刊内卷的投稿策略 在人工智能研究领域,发表SCI论文是衡量学术成果的重要指标。然而,Nature Machine Intelligence、IEEE TPAMI等顶刊的投稿竞争异常激烈,审稿周期动辄半年以上,对创新性…...
告别手动组帧!用libmodbus库5分钟搞定Modbus RTU设备数据读取(C语言实战)
5分钟极速上手:用libmodbus高效读取工业设备数据的C语言实践指南 在工业自动化现场,当我们需要快速对接一台陌生的Modbus RTU设备时,传统的手动组帧方式往往让开发者陷入繁琐的字节操作和CRC校验计算中。我曾亲眼见过一位工程师花费三天时间调…...
VSCode远程开发新姿势:用Remote-SSH直连Docker容器(附端口避坑指南)
VSCode远程开发新姿势:用Remote-SSH直连Docker容器(附端口避坑指南) 在云端开发时代,越来越多的工程师选择将开发环境封装在Docker容器中,以实现环境隔离和快速部署。然而,传统的SSH连接方式往往需要在终端…...
5个智能诊断技巧:如何快速定位开源项目性能瓶颈?
5个智能诊断技巧:如何快速定位开源项目性能瓶颈? 【免费下载链接】klipper Klipper is a 3d-printer firmware 项目地址: https://gitcode.com/GitHub_Trending/kl/klipper 当我们面对开源项目的性能问题时,往往陷入"重启大法&qu…...
Kimi/豆包/DeepSeek生成的论文怎么降AI率?不同AI工具降AIGC策略详解
Kimi/豆包/DeepSeek生成的论文怎么降AI率?不同AI工具降AIGC策略详解 2026年初,一个新现象引起了高校老师们的注意:同一个班级的毕业论文,虽然题目各不相同,但读起来总有一种微妙的"相似感"。有些论文像是同一…...
精确率 vs 召回率:为什么你的模型总是顾此失彼?
精确率 vs 召回率:为什么你的模型总是顾此失彼? 在机器学习项目的实际落地过程中,我们常常会遇到一个令人头疼的现象:当模型在某个评估指标上表现优异时,另一个指标却惨不忍睹。这种"按下葫芦浮起瓢"的困境&…...
电商API接口数据采集与应用行业分析
电商 API 接口数据采集与应用行业,已从早期的 “数据获取工具” 升级为电商数字化的核心基础设施,正处于合规化、智能化、全链路整合的高速发展期。2025 年中国电商数据服务市场规模约1800 亿元,年复合增长率25%-30%;全球跨境电商…...
计算机专业的大学生能参加哪些比赛?看完这篇就开干吧!
计算机专业的大学生能参加哪些比赛?看完这篇就开干吧! 对于计算机专业大学生而言,网络安全相关比赛是提升实战能力、丰富简历亮点的最佳途径。尤其是CTF竞赛和护网行动,已成为企业招聘时的核心参考指标。 本文梳理了适合大学生参…...
