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
五、解题思路
- 将输入的字符串按空格分割为两部分,分别为箱子的字符串和空地的宽度;
- 创建一个HashMap map,用于存储每行的字符串;Key为行的下标,Value为对应的字符串;
- 遍历箱子的字符串,根据空地的宽度确定每个字符应该放置的行和列;
- 计算当前字符所在的列,即columnIdx = i / num,其中i为当前字符的索引;
- 如果columnIdx是偶数,则表示从左往右摆放,行索引不变,列索引为i % num;
- 如果columnIdx是奇数,则表示从右往左摆放,行索引不变,列索引为num - 1 - (i % num),即倒序摆放;
- 将当前字符添加到对应行的字符串中;
- 遍历HashMap map,按行输出箱子的摆放位置;
- 输出结果。
六、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算法的适用场景,发现新题目,随时更新。