当前位置: 首页 > article >正文

【华为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),反转方向。
输出结果:

遍历完成后,每一行记录了一部分字符,逐行输出即可。

# 输入字符串和锯齿高度(行数)
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 递减。
当到达边界时,改变方向。
按行输出:

遍历网格的每一行,输出非空字符组成的字符串。

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++解法

  • 解题思路
更新中

C解法

  • 解题思路

本代码实现了将输入的字符串按照 "之"字形排列 的功能,并将每一行内容输出。之字形排列的核心在于字符的行号的变化规则:

从第一行开始,按顺序将字符分配到每一行,直到最后一行。
到达最后一行后,开始逆序向上排列,直到回到第一行。
重复上述过程,直到字符串排列完毕。
具体步骤
动态分配二维数组:

创建一个大小为
𝑛
n 的字符指针数组,每个指针指向一行字符。
每行分配内存,大小为字符串长度
strlen(str)
strlen(str)。
初始化每行为空字符串,用于后续拼接字符。
字符分配规则:

使用变量 reverse 控制方向:
reverse = 1 表示从下向上。
reverse = 0 表示从上向下。
计算当前字符应该插入的行号 k,将字符追加到对应行的字符串末尾。
打印与内存释放:

遍历二维数组,逐行打印已分配的字符串。
打印完成后释放每行的内存以及整个数组。

#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解法

  • 解题思路

更新中

注意:

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


http://www.kler.cn/a/449953.html

相关文章:

  • zabbix监控山石系列Hillstone监控模版(适用于zabbix7及以上)
  • k8s dashboard可视化操作界面的安装
  • 【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
  • 公交车信息管理系统:实现交通数据的智能化处理
  • 解释下什么是面向对象?面向对象和面向过程的区别?
  • Java设计模式 —— 【结构型模式】外观模式详解
  • c# 后台任务自动执行
  • springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
  • 【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的?
  • 验证码机制
  • C/C++基础知识复习(43)
  • 库卡机器人维修A5轴力矩过大报警故障
  • vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,
  • skyler实战渗透笔记(十)—IMF
  • python学opencv|读取图像(十七)认识alpha通道
  • 计算机基础复习12.23
  • TSN(时间敏感网络)介绍
  • 【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
  • 重温设计模式--代理模式
  • LeetCode72. 编辑距离(2024冬季每日一题 37)
  • 不同路径
  • 2023-2024年云赛道模拟题库
  • Java重要面试名词整理(二):SpringMyBatis
  • Mac系统下 idea中如何创建maven项目
  • 从零开始C++游戏开发之第七篇:游戏状态机与回合管理
  • 买卖股票的最佳时机 IV - 困难