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

注意:

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

相关推荐
殇淋狱陌9 分钟前
第四章 列表(List)&元组(Tuple)以及代码格式基础语法及操作
数据结构·python·数据分析·list·元组
莫名其妙小饼干11 分钟前
时间管理系统|Java|SSM|JSP|
java·开发语言·maven·mssql
苹果酱056722 分钟前
【react项目】从零搭建react项目[nodejs安装]
java·spring boot·毕业设计·layui·课程设计
人类群星闪耀时28 分钟前
使用Python实现量子密钥分发:构建安全通信的未来
python·安全·量子计算
jjw_zyfx29 分钟前
flask before_request 请求拦截器返回无值则放行,有值则拦截
后端·python·flask
KevinRay_30 分钟前
【Python入门】类和对象
服务器·前端·python·类和对象
岁月变迁呀32 分钟前
长轮询DeferredResult原理
java·spring
瞻邈33 分钟前
lpips使用笔记
人工智能·python·深度学习
瞻邈37 分钟前
Diffusers使用笔记
人工智能·python·深度学习
数据小小爬虫43 分钟前
如何利用Java爬虫获得Lazada商品评论列表
java·开发语言