【华为OD-E卷-箱子之字形摆放 100分(python、java、c++、js、c)】
题目
有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置
输入描述
- 输入一行字符串,通过空格分隔,前面部分为字母或数字组成的字符串str,表示箱子; 后面部分为数字n,表示空地的宽度。例如: ABCDEFG 3
输出描述
- 箱子摆放结果,如题目示例所示
AFG BE CD 备注 请不要在最后一行输出额外的空行 str只包含字母和数字,1 <= len(str) <= 1000 1 <= n <= 1000
用例
用例一:
输入:
ABCDEFG 3
输出:
AFG
BE
CD
python解法
- 解题思路:
- 该代码实现了一个模拟"锯齿形输出"的过程,类似于文字按照 "之" 字形排布。
具体思路:
输入数据:
boxes 是一个字符串,表示需要排列的字符序列。
width 是锯齿的高度,即需要输出的行数。
锯齿形排列逻辑:
使用一个方向变量 direction,控制字符向上还是向下排列。
pos 表示当前字符在行列表中的索引(行号)。
按顺序遍历字符串 boxes:
将当前字符添加到对应行。
更新当前行的索引 pos,根据 direction 移动。
如果达到锯齿形边界(pos == width 或 pos < 0),反转方向。
输出结果:
遍历完成后,每一行记录了一部分字符,逐行输出即可。
python
# 输入字符串和锯齿高度(行数)
boxes, width = input().split()
width = int(width)
# 初始化每一行的字符列表
levels = [''] * width
# 初始方向和位置
direction = 1 # 1 表示向下,-1 表示向上
pos = 0 # 当前字符的行位置
# 遍历字符串中的每个字符
for char in boxes:
levels[pos] += char # 将字符添加到当前行
pos += direction # 更新行位置
# 如果达到锯齿边界,则反转方向
if pos == width or pos < 0:
direction *= -1 # 改变方向
pos += direction # 修正位置,确保不越界
# 输出每一行的结果
for level in levels:
print(level)
java解法
- 解题思路
- 这段代码实现了一个"锯齿形排列"的功能,将输入字符串按照给定的行数
𝑛
n 排列成"之"字形,然后按行输出。
具体思路:
创建网格:
使用一个二维字符数组 grid 来存储字符串的字符排列,其中行数为
𝑛
n,列数为字符串长度。
初始状态下,grid 的所有元素默认为空字符 \0。
字符填充:
遍历字符串的每个字符,根据当前方向(从上到下或从下到上),将字符依次填入网格的相应位置。
使用变量 row 表示当前填充的行号,leftToRight 表示当前方向:
如果方向是从上到下,row 递增。
如果方向是从下到上,row 递减。
当到达边界时,改变方向。
按行输出:
遍历网格的每一行,输出非空字符组成的字符串。
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入字符串和锯齿形行数
String str = sc.next();
int n = sc.nextInt();
displayZigZag(str, n);
}
// 显示锯齿形排列的函数
public static void displayZigZag(String str, int n) {
// 创建二维字符数组用于存储锯齿形排列
char[][] grid = new char[n][str.length()];
// 方向控制变量:true 表示向下,false 表示向上
boolean leftToRight = true;
int row = 0; // 当前行号
// 遍历字符串中的每个字符
for (int i = 0; i < str.length(); i++) {
// 将字符填入当前行的对应位置
grid[row][i] = str.charAt(i);
// 根据方向更新行号
if (leftToRight) {
row++;
// 如果到达底部,改变方向为向上
if (row == n) {
row = n - 1;
leftToRight = false;
}
} else {
row--;
// 如果到达顶部,改变方向为向下
if (row < 0) {
row = 0;
leftToRight = true;
}
}
}
// 按行输出锯齿形排列的字符
for (int i = 0; i < n; i++) {
for (int j = 0; j < str.length(); j++) {
if (grid[i][j] != '\0') { // 只输出非空字符
System.out.print(grid[i][j]);
}
}
if (i < n - 1) { // 除最后一行外,换行
System.out.println();
}
}
}
}
C++解法
- 解题思路
cpp
更新中
C解法
解题思路
本代码实现了将输入的字符串按照 "之"字形排列 的功能,并将每一行内容输出。之字形排列的核心在于字符的行号的变化规则:
从第一行开始,按顺序将字符分配到每一行,直到最后一行。
到达最后一行后,开始逆序向上排列,直到回到第一行。
重复上述过程,直到字符串排列完毕。
具体步骤
动态分配二维数组:
创建一个大小为
𝑛
n 的字符指针数组,每个指针指向一行字符。
每行分配内存,大小为字符串长度
strlen(str)
strlen(str)。
初始化每行为空字符串,用于后续拼接字符。
字符分配规则:
使用变量 reverse 控制方向:
reverse = 1 表示从下向上。
reverse = 0 表示从上向下。
计算当前字符应该插入的行号 k,将字符追加到对应行的字符串末尾。
打印与内存释放:
遍历二维数组,逐行打印已分配的字符串。
打印完成后释放每行的内存以及整个数组。
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数:将字符串按照"之"字形排列并打印
void getResult(char *str, int n) {
// 动态创建二维数组,每行是一个字符串
char **matrix = (char **)malloc(n * sizeof(char *));
for (int i = 0; i < n; i++) {
matrix[i] = (char *)malloc(strlen(str) + 1); // 分配每行的内存
matrix[i][0] = '\0'; // 初始化为空字符串
}
int reverse = 1; // 方向标志,1 表示从下到上,0 表示从上到下
// 遍历字符串中的每个字符
for (int i = 0; i < strlen(str); i++) {
int k = i % n; // 计算当前字符对应的行号
if (k == 0) reverse = !reverse; // 到达行首或行尾时反转方向
if (reverse) k = n - 1 - k; // 如果是从下到上,则调整行号
// 将字符追加到对应行的字符串末尾
int len = strlen(matrix[k]); // 获取当前行已有字符的长度
if (len < strlen(str)) { // 确保不超过最大长度
matrix[k][len] = str[i]; // 插入字符
matrix[k][len + 1] = '\0'; // 添加字符串结束符
}
}
// 打印排列后的结果
for (int i = 0; i < n; i++) {
printf("%s\n", matrix[i]);
free(matrix[i]); // 释放每行的内存
}
free(matrix); // 释放二维数组的内存
}
int main() {
char str[100]; // 假设输入字符串最大长度为 100
int n;
// 输入字符串和行数
scanf("%s", str);
scanf("%d", &n);
// 检查行数是否合法
if (n <= 0) {
printf("Invalid input for n.\n");
return 1; // 行数不能为非正数
}
// 调用函数实现锯齿形排列并输出
getResult(str, n);
return 0;
}
JS解法
解题思路
javascript
更新中
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏