华为OD机试 - 箱子之形摆放(Python/JS/C/C++ 2025 A卷 100分)

在这里插入图片描述

2025华为OD机试题库(按算法分类):2025华为OD统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上,输出箱子的摆放位置,例如:箱子ABCDEFG,空地宽为3。

摆放效果如下图:
在这里插入图片描述
则输出结果为:

AFG
BE
CD

二、输入描述

一行字符串,通过空格分割两部分,前面str部分表示箱子的字符串由数字或字母组成,后面部分是表示宽度的数字n,

如下:

ABCDEFG 3

三、输出描述

输出:

AFG
BE
CD

注:最后一行不得输出额外的空行

str只包含数字和数字,1<=len(str)<=1000,1<=n<=1000。

四、测试用例

测试用例1

1、输入

ABCDEFGHIJKMLN 4

2、输出

AHI
BGJ
CFKN
DEML

测试用例2

1、输入

ABCDEFG 3

2、输出

AFG
BE
CD

五、解题思路

  1. 将输入的字符串按空格分割为两部分,分别为箱子的字符串和空地的宽度;
  2. 创建一个HashMap map,用于存储每行的字符串;Key为行的下标,Value为对应的字符串;
  3. 遍历箱子的字符串,根据空地的宽度确定每个字符应该放置的行和列;
    • 计算当前字符所在的列,即columnIdx = i / num,其中i为当前字符的索引;
    • 如果columnIdx是偶数,则表示从左往右摆放,行索引不变,列索引为i % num;
    • 如果columnIdx是奇数,则表示从右往左摆放,行索引不变,列索引为num - 1 - (i % num),即倒序摆放;
    • 将当前字符添加到对应行的字符串中;
  4. 遍历HashMap map,按行输出箱子的摆放位置;
  5. 输出结果。

六、Python算法源码

# -*- coding: utf-8 -*-
# 导入 sys 模块,用于读取标准输入
import sys

def main():
    # 读取输入行,并去除尾部换行符
    line = sys.stdin.readline().rstrip('\n')
    # 按空格拆分输入,得到箱子字符串和空地宽度
    parts = line.split(" ")
    s = parts[0]                  # 箱子字符串
    n = int(parts[1])             # 空地宽度,即行数

    # 初始化一个列表,每个元素为一个空字符串,用于存储每行的结果
    rows = ['' for _ in range(n)]
    
    # 遍历每个字符,确定其应该放在哪一行
    for i, ch in enumerate(s):
        col = i // n            # 计算字符所在的列号
        if col % 2 == 0:
            # 偶数列,正序:行号为 i 对 n 的余数
            row = i % n
        else:
            # 奇数列,逆序:行号为 n - 1 - (i % n)
            row = n - 1 - (i % n)
        # 将字符追加到对应行的字符串中
        rows[row] += ch

    # 按行输出结果,注意最后一行不额外输出空行
    for r in rows:
        print(r)

if __name__ == '__main__':
    main()

七、JavaScript算法源码

// 使用 Node.js 的方式读取输入
const readline = require('readline');

// 创建 readline 接口,从标准输入中读取数据
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    terminal: false
});

// 读取输入
let inputData = '';
rl.on('line', function(line){
    inputData += line;
}).on('close', function(){
    // 按空格拆分输入数据,获取箱子字符串和空地宽度
    let parts = inputData.split(" ");
    let s = parts[0];             // 箱子字符串
    let n = parseInt(parts[1]);   // 空地宽度,即行数

    // 初始化数组,每个元素为空字符串,用于存储每行结果
    let rows = new Array(n).fill('');
    
    // 遍历箱子字符串的每个字符
    for (let i = 0; i < s.length; i++) {
        let col = Math.floor(i / n);  // 计算当前字符所在的列
        let row;
        if (col % 2 === 0) {
            // 偶数列,正序:行号为 i 对 n 取余
            row = i % n;
        } else {
            // 奇数列,逆序:行号为 n - 1 - (i % n)
            row = n - 1 - (i % n);
        }
        // 将当前字符追加到对应行的字符串中
        rows[row] += s.charAt(i);
    }
    
    // 输出每一行的结果,最后一行不多输出空行
    for (let i = 0; i < rows.length; i++) {
        console.log(rows[i]);
    }
});

八、C算法源码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LEN 1100  // 因为箱子字符数最多1000,加上结尾符

int main() {
    char inputLine[MAX_LEN];
    // 读取整行输入
    if (fgets(inputLine, sizeof(inputLine), stdin) == NULL) {
        return 1;
    }
    
    // 去除可能的换行符
    inputLine[strcspn(inputLine, "\n")] = '\0';
    
    // 用 strtok 拆分输入,得到箱子字符串和宽度字符串
    char *s = strtok(inputLine, " ");
    char *nStr = strtok(NULL, " ");
    int n = atoi(nStr);  // 空地宽度,即行数
    
    int len = strlen(s);
    
    // 创建二维字符数组存储每行的结果,每行预留足够空间
    // 注意:最多1000个字符,加上结尾符,故设置为 MAX_LEN
    char rows[n][MAX_LEN];
    // 初始化每一行为空字符串
    for (int i = 0; i < n; i++) {
        rows[i][0] = '\0';
    }
    
    // 临时缓冲区,用于追加字符,每次追加1个字符后加'\0'
    char temp[2];
    temp[1] = '\0';
    
    // 遍历箱子字符串的每个字符
    for (int i = 0; i < len; i++) {
        int col = i / n;   // 当前字符所在的列号
        int row;
        if (col % 2 == 0) {
            // 偶数列,正序:行号为 i 对 n 的余数
            row = i % n;
        } else {
            // 奇数列,逆序:行号为 n - 1 - (i % n)
            row = n - 1 - (i % n);
        }
        // 将字符转换为字符串,便于 strcat 连接
        temp[0] = s[i];
        strcat(rows[row], temp);
    }
    
    // 按行输出结果,每行末尾没有额外空行
    for (int i = 0; i < n; i++) {
        printf("%s", rows[i]);
        if(i < n-1) printf("\n");
    }
    
    return 0;
}

九、C++算法源码

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;

int main() {
    string line;
    // 读取整行输入
    getline(cin, line);
    
    // 使用 stringstream 拆分输入,得到箱子字符串和宽度
    istringstream iss(line);
    string s; 
    int n;
    iss >> s >> n;  // s 为箱子字符串,n 为空地宽度,即行数

    // 初始化一个 vector,每个元素为一个空字符串,存储每一行的结果
    vector<string> rows(n, "");
    
    // 遍历箱子字符串中每个字符
    for (int i = 0; i < s.size(); i++) {
        int col = i / n;  // 计算当前字符所在的列号
        int row;
        if (col % 2 == 0) {
            // 偶数列,正序:行号为 i 对 n 取余
            row = i % n;
        } else {
            // 奇数列,逆序:行号为 n - 1 - (i % n)
            row = n - 1 - (i % n);
        }
        // 将当前字符追加到对应行的字符串中
        rows[row].push_back(s[i]);
    }
    
    // 依次输出每一行,确保最后一行无额外空行
    for (int i = 0; i < n; i++) {
        cout << rows[i];
        if (i < n - 1) cout << "\n";
    }
    
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2025 A卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值