【华为OD-E卷-箱子之字形摆放 100分(python、java、c++、js、c)】

【华为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 复制代码
更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

相关推荐
敲上瘾4 分钟前
基础dp——动态规划
java·数据结构·c++·python·算法·线性回归·动态规划
阑梦清川19 分钟前
Jupyter里面的manim编程学习
python·jupyter·manim
my_styles24 分钟前
2025-alibaba-Sentinel组件
java·开发语言·sentinel
Dongwoo Jeong25 分钟前
类型系统下的语言分类与类型系统基础
java·笔记·python·lisp·fortran·type
肖帆咪27 分钟前
deepseek自动化代码生成
java·ai·自动化·ai编程·deepseek
刘小炮吖i31 分钟前
Java 集合:单列集合和双列集合的深度剖析
java·集合
float_六七37 分钟前
Java——单例类设计模式
java·单例模式·设计模式
一个儒雅随和的男子1 小时前
Future和FutureTask实现类详解以及使用。
java
enyp801 小时前
*PyCharm 安装教程
ide·python·pycharm