当前位置: 首页 > news >正文

华为OD机试真题——数字螺旋矩阵(2025B卷:100分)Java/python/JavaScript/C++最佳实现

在这里插入图片描述

2025 B卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C++等多种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《数字螺旋矩阵》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++


题目名称:数字螺旋矩阵


  1. 知识点:数组模拟、边界控制(螺旋遍历算法)
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

疫情期间,小明隔离在家,在纸上写数字玩。他发明了一种写法:
给定数字个数 n(0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内的顺序依次写出2, 3, …, n,最终形成一个 m 行矩阵。矩阵需满足以下要求:

  1. 每行数字个数相同
  2. 列数尽可能少(即列数取最小能满足条件的值);
  3. 优先填充矩阵外层,再向内层螺旋填充;
  4. 数字不足时用 * 占位

输入描述
一行两个整数,空格隔开,分别表示 nm

输出描述
符合要求的唯一矩阵,每行元素用空格隔开。

示例1
输入:

9 4

输出:

1 2 3
* * 4
9 * 5
8 7 6

说明:9个数字写成4行,最少需要3列。

示例2
输入:

3 5

输出:

1
2
3
*
*

说明:3个数字写5行,仅需1列,不足部分用 * 填充。


Java

问题分析

题目要求生成一个螺旋矩阵,按照顺时针螺旋向内的顺序填充数字 1 到 n,矩阵需满足:

  1. 行数固定为 m
  2. 列数尽可能少(最小列数满足 m×c ≥ n)
  3. 数字不足时用 * 占位

关键点:

  • 计算最小列数 c = ceil(n/m)
  • 按顺时针螺旋顺序填充数字
  • 处理非方阵的边界情况
  • 数字不足时填充占位符

解题思路

  1. 计算最小列数

    • 列数 c 需满足 m×c ≥ n
    • c = (n + m - 1) / m(向上取整)
  2. 初始化矩阵

    • 创建 m 行 c 列的矩阵
    • 所有元素初始化为 “*”
  3. 螺旋填充数字

    • 定义四个方向的边界:上(top)、下(bottom)、左(left)、右(right)
    • 按照右下左上的顺序螺旋填充
    • 每次完成一个方向后收缩边界
    • 当填充数字达到 n 时停止
  4. 输出矩阵

    • 每行元素用空格连接输出

代码实现

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();// 1. 计算最小列数(向上取整)int c = (n + m - 1) / m;// 2. 初始化矩阵(全部填充为*)String[][] matrix = new String[m][c];for (int i = 0; i < m; i++) {for (int j = 0; j < c; j++) {matrix[i][j] = "*";}}// 3. 螺旋填充数字int top = 0, bottom = m - 1;int left = 0, right = c - 1;int count = 1; // 当前填充的数字while (count <= n && top <= bottom && left <= right) {// 向右填充(上边界)for (int j = left; j <= right && count <= n; j++) {matrix[top][j] = String.valueOf(count++);}top++;// 向下填充(右边界)for (int i = top; i <= bottom && count <= n; i++) {matrix[i][right] = String.valueOf(count++);}right--;// 向左填充(下边界)if (top <= bottom) {for (int j = right; j >= left && count <= n; j--) {matrix[bottom][j] = String.valueOf(count++);}bottom--;}// 向上填充(左边界)if (left <= right) {for (int i = bottom; i >= top && count <= n; i--) {matrix[i][left] = String.valueOf(count++);}left++;}}// 4. 输出矩阵for (int i = 0; i < m; i++) {System.out.println(String.join(" ", matrix[i]));}}
}

代码解析

  1. 输入处理

    int n = scanner.nextInt();
    
http://www.xdnf.cn/news/915877.html

相关文章:

  • aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain
  • 【STM32F1标准库】理论——定时器中的输出比较
  • 桑荫不徙 · 时之沙 | 在筛选与共生之间,向轻盈之境远航
  • C++组合
  • C++.OpenGL (12/64)光照贴图(Lightmaps)
  • 【飞腾AI加固服务器】全国产化飞腾+昇腾310+PCIe Switch的AI大模型服务器解决方案
  • SQL Server 日期时间类型全解析:从精确存储到灵活转换
  • 限流算法java实现
  • 使用 Redisson 实现分布式锁—解决方案详解
  • Gradle 7.0 及以上版本集中管理项目依赖项的版本号、插件版本和库坐标
  • 【Fiddler工具判断前后端Bug】
  • Modbus RTU/TCP 协议详解与Spring Boot集成指南
  • 开疆智能Ethernet/IP转Modbus网关连接西门子BW500积算仪配置案例
  • 【软件工具】批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项
  • 一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (二)
  • 【Java微服务组件】分布式协调P4-一文打通Redisson:从API实战到分布式锁核心源码剖析
  • WPF八大法则:告别模态窗口卡顿
  • 为什么React列表项需要key?(React key)(稳定的唯一标识key有助于React虚拟DOM优化重绘大型列表)
  • 探索C++标准模板库(STL):String接口的底层实现(下篇)
  • 项目-- Json-Rpc框架
  • 前端模块化
  • 飞牛云一键设置动态域名+ipv6内网直通访问内网的ssh服务-家庭云计算专家
  • 微前端 - Module Federation使用完整示例
  • 《经济学原理》第9版第6章供给、需求和政府政策
  • XSS(跨站脚本攻击)详解
  • linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof
  • jvm 垃圾收集算法 详解
  • UDP 与 TCP 调用接口的差异:面试高频问题解析与实战总结
  • html如何在一张图片上的某一个区域做到点击事件
  • 【Docker 01】Docker 简介