华为OD机试真题——数字螺旋矩阵(2025B卷:100分)Java/python/JavaScript/C++最佳实现
2025 B卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C++等多种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《数字螺旋矩阵》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
题目名称:数字螺旋矩阵
- 知识点:数组模拟、边界控制(螺旋遍历算法)
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
疫情期间,小明隔离在家,在纸上写数字玩。他发明了一种写法:
给定数字个数 n
(0 < n ≤ 999)和行数 m
(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行,仅需1列,不足部分用 *
填充。
Java
问题分析
题目要求生成一个螺旋矩阵,按照顺时针螺旋向内的顺序填充数字 1 到 n,矩阵需满足:
- 行数固定为 m
- 列数尽可能少(最小列数满足 m×c ≥ n)
- 数字不足时用 * 占位
关键点:
- 计算最小列数 c = ceil(n/m)
- 按顺时针螺旋顺序填充数字
- 处理非方阵的边界情况
- 数字不足时填充占位符
解题思路
-
计算最小列数:
- 列数 c 需满足 m×c ≥ n
- c = (n + m - 1) / m(向上取整)
-
初始化矩阵:
- 创建 m 行 c 列的矩阵
- 所有元素初始化为 “*”
-
螺旋填充数字:
- 定义四个方向的边界:上(top)、下(bottom)、左(left)、右(right)
- 按照右下左上的顺序螺旋填充
- 每次完成一个方向后收缩边界
- 当填充数字达到 n 时停止
-
输出矩阵:
- 每行元素用空格连接输出
代码实现
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]));}}
}
代码解析
-
输入处理:
int n = scanner.nextInt();