箱子之字形摆放

一、题目描述

有一批箱子(形式为字符串,设为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);
        }
    }
}
相关推荐
小雨下雨的雨8 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.11 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
明夜之约11 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee11 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs11 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司11 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
一条小锦吕*11 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
綝~12 小时前
爬虫数据采集工程师岗位面试题
爬虫·面试·请求
fangdengfu12312 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch
云烟成雨TD12 小时前
Spring AI 1.x 系列【51】可观测性技术选型
java·人工智能·spring