箱子之字形摆放

一、题目描述

有一批箱子(形式为字符串,设为str),要求将这批箱子按从上到下以之字形的顺序摆放在宽度为n的空地,请输出箱子的摆放位置。

例如:箱子ABCDEFG,空地宽度为3,摆放结果如下:

AFG

BE

CD

二、输入输出描述

输入描述

一行字符串,通过空格分隔:

  • 第一部分:字母或数字组成的字符串str,表示箱子;
  • 第二部分:整数 n,为空地的宽度。
输出描述
  • 按行输出之字形摆放后的字符串,每行对应一行箱子。

备注:

  1. 请不要在最后一行输出额外的空行

  2. str只包含字母和数字,1 <= len(str) <= 1000

  3. 1 <= n <= 1000

三、示例

|----|-----------|
| 输入 | ABCDEFG 3 |
| 输出 | AFG BE CD |
| 说明 | |

四、解题思路

1、核心思想

模拟Z字形遍历路径 + 行缓冲区管理。通过维护当前行位置和移动方向,将字符串中的字符按照Z字形路径依次分配到对应的行缓冲区中,最后按行输出。

2、问题本质分析

  1. Z字形路径规律

    • 字符从上到下按行分配,到达底部后改变方向

    • 然后从下到上按行分配,到达顶部后再改变方向

    • 形成"下-上-下-上"的锯齿形移动模式

  2. 边界处理

    • n=1时,直接输出原字符串(没有Z字形变化)

    • 到达第0行(顶部)时,方向变为向下

    • 到达第n-1行(底部)时,方向变为向上

  3. 数据结构选择

    • 使用StringBuilder数组存储每行的字符

    • 每个StringBuilder对应一行,最后拼接成字符串

  4. 方向控制

    • step变量表示移动方向:1表示向下,-1表示向上

    • 在边界处改变方向

3、核心逻辑

  1. 初始化阶段

    • 创建n个StringBuilder对象,对应n行

    • 初始化当前位置为第0行

    • 初始方向为向下(step=1

  2. 字符分配循环

    • 将当前字符添加到当前行对应的StringBuilder

    • 字符索引index递增

    • 判断是否到达边界:

      • 如果在第0行,方向设为向下

      • 如果在第n-1行,方向设为向上

    • 根据step更新当前行:currentRow += step

  3. 特殊处理

    • n=1时,整个字符串都在同一行,直接输出

    • 这避免了方向判断的逻辑复杂度

  4. 结果输出

    • 遍历所有行的StringBuilder

    • 每行输出为一个独立字符串

4、步骤拆解

  1. 输入解析

    • 读取整行输入

    • 按空格分割为字符串str和行数n

  2. 边界情况处理

    • 如果n==1,直接输出str并结束
  3. 数据结构初始化

    • 创建StringBuilder数组rows,长度为n

    • 为每个元素创建新的StringBuilder

    • 初始化变量:

      • index=0:字符位置指针

      • currentRow=0:当前行

      • step=1:移动方向(初始向下)

  4. Z字形遍历主循环

    • index < str.length()时继续循环

    • 操作序列:

      a. 将str.charAt(index)添加到rows[currentRow]

      b. index++移动到下一个字符

      c. 边界判断更新方向:

      • 如果currentRow==0step=1(向下)

      • 如果currentRow==n-1step=-1(向上)

        d. 更新当前行:currentRow += step

  5. 结果拼接输出

    • 遍历rows数组

    • 输出每个StringBuilder的字符串表示

    • 每行单独输出

五、代码实现

java 复制代码
import java.util.*;

public class ZigZagBox {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 读取整个输入行
        String line = sc.nextLine();
        // 按空格分割成两部分:字符串 和 行数n
        String[] parts = line.split(" ");
        String str = parts[0];
        int n = Integer.parseInt(parts[1]);
        
        // 特殊情况:只有一行,直接输出原串
        if (n == 1) {
            System.out.println(str);
            return;
        }
        
        // 每行用一个 StringBuilder 存储
        StringBuilder[] rows = new StringBuilder[n];
        for (int i = 0; i < n; i++) {
            rows[i] = new StringBuilder();
        }
        
        int index = 0;      // 当前字符位置
        int currentRow = 0; // 当前所在行
        int step = 1;       // 方向:1=向下,-1=向上
        
        // 遍历所有字符
        while (index < str.length()) {
            // 把当前字符加入对应行
            rows[currentRow].append(str.charAt(index));
            index++;
            
            // 方向判断:到顶部则向下,到底部则向上
            if (currentRow == 0) {
                step = 1;
            } else if (currentRow == n - 1) {
                step = -1;
            }
            
            // 移动到下一行
            currentRow += step;
        }
        
        // 按行输出结果
        for (StringBuilder sb : rows) {
            System.out.println(sb);
        }
    }
}
相关推荐
驱动小百科11 分钟前
华为手机USB驱动程序下载 一键安装教程(Win10/Win11通用)
华为·华为usb驱动下载·华为手机驱动安装·usb驱动安装教程·华为手机连接电脑没反应
优橙教育15 分钟前
华为HCSP认证备考全攻略:5G网优方向
5g·华为
optimistic_chen1 小时前
【AI Agent 全栈开发】MCP
java·linux·运维·人工智能·ai编程·mcp
Brilliantwxx1 小时前
【C++】 继承与多态(中)
开发语言·c++·笔记·算法
程序员雷欧8 小时前
大厂计算机网络面试高频题
计算机网络·面试·职场和发展
2401_833269308 小时前
Java网络编程入门
java·开发语言
金銀銅鐵8 小时前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
それども9 小时前
Gradle 构建疑难杂症 Could not find netty-transport-native-epoll-linux-aarch_64.ja
java·服务器·gradle·maven
正儿八经的少年9 小时前
application.yml 系列配置文件作用与区别
java·配置文件
鱼很腾apoc10 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程