华为OD机试真题 - 螺旋数字矩阵 (D卷,100分)

题目描述

疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:

给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出2,3,....,n,最终形成一个 m 行矩阵。

小明对这个矩阵有些要求:

  1. 每行数字的个数一样多
  2. 列的数量尽可能少
  3. 填充数字时优先填充外部
  4. 数字不够时,使用单个 * 号占位
  5. 目录

    题目描述

    输入描述

    输出描述

    用例

    题目解析

    Java算法源码

    JS算法源码

    Python算法源码

    C算法源码

    华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100分,第三道为中等或困难题,分值为200分。总分为400分,150分钟,机试是在牛客考试,练习的时候也可以在牛客网练习,提前熟悉操作

    https://ac.nowcoder.com/acm/contest/5652/K

    点击上方链接进入牛客练习界面,可以自定义题目,自定义输入、输出等等,华为OD真实机试环境,非其他第三方平台模拟。

输入描述

两个整数,空格隔开,依次表示 n、m

输出描述

符合要求的唯一矩阵

用例

输出

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

说明

9个数字写出4行,最少需要3列

输出

1 2 3 * *

说明

3个数字写5行,只有一列,数字不够用*号填充

输出

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 19 45 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 63 20 44 83 114 115 116 117 118 119 120 * * * * * * 99 64 21 43 82 113 112 111 110 109 108 107 106 105 104 103 102 101 100 65 22 42 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 23 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24

说明

题目解析

  1. 首先,根据输入的 n 和 m,计算出矩阵的行数和列数。
  2. 然后,创建一个二维数组来表示矩阵,并初始化为空字符串。
  3. 接下来,按照顺时针螺旋向内填充数字。从左上角开始,先向右填充数字,直到达到最右边;然后向下填充数字,直到达到最下边;接着向左填充数字,直到达到最左边;最后向上填充数字,直到达到最上边。
  4. 在填充数字的过程中,如果当前位置已经有数字,则跳过该位置,继续填充下一个位置。
  5. 如果数字不够填充整个矩阵,则使用单个 * 号占位。
  6. 最后,将填充好的矩阵按行输出。

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const [n, m] = (await readline()).split(" ").map(Number);

  const k = Math.ceil(n / m);

  const matrix = new Array(m).fill(0).map(() => new Array(k).fill("*"));

  let step = 1;

  let x = 0;
  let y = 0;

  while (step <= n) {
    while (y < k && matrix[x][y] == "*" && step <= n) matrix[x][y++] = step++;
    y -= 1;
    x += 1;

    while (x < m && matrix[x][y] == "*" && step <= n) matrix[x++][y] = step++;
    x -= 1;
    y -= 1;

    while (y >= 0 && matrix[x][y] == "*" && step <= n) matrix[x][y--] = step++;
    y += 1;
    x -= 1;

    while (x >= 0 && matrix[x][y] == "*" && step <= n) matrix[x--][y] = step++;
    x += 1;
    y += 1;
  }

  for (let i = 0; i < m; i++) {
    console.log(matrix[i].join(" "));
  }
})()

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试题库D卷 文章被收录于专栏

2024年5-11月份考的D卷,不用再看AB卷,CD卷题目一样。多种语言解法,欢迎提供更好的解法。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务