首页 > 其他分享 >华为OD机试真题---箱子之字形摆放

华为OD机试真题---箱子之字形摆放

时间:2024-12-28 08:58:50浏览次数:8  
标签:map 之字形 字符 真题 index OD 摆放 索引 字符串

华为OD机试中的“箱子之字形摆放”问题是一个经典的数组处理和模拟算法问题。以下是对该问题的详细解析:

一、题目描述

有一批箱子,用一个字符串来表示每个箱子上的编号(编号由字母和数字组成)。要求将这批箱子按照之字形顺序摆放在宽度为n的空地上,并输出它们的摆放位置。之字形摆放要求每行的箱子是交替从左到右,或者从右到左摆放的,形成类似“Z”字形的排列。

二、输入描述

输入只有一行字符串,格式为“str n”,其中str是表示箱子的字符串,n是空地的宽度(也即每行可以摆放的箱子数量)。

三、输出描述

输出箱子的摆放结果,每行输出一组摆放好的箱子,并且不应该输出多余的空行。

四、解题思路

为了正确地按照之字形摆放箱子,可以将这个问题分解为以下几个步骤:

  1. 初始化矩阵:根据宽度n,创建一个二维数组(或列表),每一行用于存放按照之字形摆放的字符。
  2. 确定每个字符的位置:通过遍历字符串中的每个字符,使用行索引来确定字符应该放置在哪一行。如果当前字符应该从左往右摆放,则按照正常顺序填充;如果当前字符应该从右往左摆放,则需要将字符放置在倒数位置。
  3. 交替顺序控制:通过对当前字符的索引值进行模运算,判断当前行是需要从左到右还是从右到左摆放。可以通过一个标志位来控制当前行的摆放方向。
  4. 输出矩阵:最后将每一行的字符拼接成字符串输出。

五、具体实现

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class ZigZagBoxesSimplified {

    public static void main(String[] args) {
        // 创建Scanner对象以读取输入,本例中未使用输入,直接使用了定义好的字符串
        Scanner sc = new Scanner(System.in);
        // 定义一个包含字母和数字的字符串,用于后续处理
        String line = sc.nextLine();
        // 将字符串按空格分割为两部分,第一部分为字母串,第二部分为数字
        String[] strings = line.split(" ");
        // 将字符串中的数字转换为整数,用于确定列的宽度
        int n = Integer.parseInt(strings[1]);
        // map key用来存放每一行的下标,value对应的字符串
        Map<Integer, String> map = new HashMap<>();
        // 提取字母串,用于后续的处理
        String letterStr = strings[0];
        // 遍历字母串,根据列的宽度进行分组
        for (int i = 0; i < letterStr.length(); i++) {
            // 计算当前字符属于第几列
            int columnIdx = i/n;
            // 根据列的奇偶性决定字符的存放顺序
            int index;
            // 如果是偶数列,那么是正序,奇数列是倒序
            if (columnIdx % 2 == 0) {
                // 索引正序
                index = i % n;
            }else {
                // 如果是奇数列,那么是倒序
                index = n - 1 - i % n;
            }
            // 获取当前索引下的字符串,如果不存在则返回空字符串
            String str = map.getOrDefault(index, "");
            // 将当前字符添加到对应的字符串末尾
            String val = str + letterStr.charAt(i);
            // 将更新后的字符串存回map
            map.put(index, val);

        }
        // 遍历map,打印每一行的字符串
        for (int key : map.keySet()) {
            System.out.println(map.get(key));
        }


    }

}


六、示例

示例1

  • 输入:ABCDEFG 3
  • 输出:
AFG
BE
CD

示例2

  • 输入:HELLOWORLD 4
  • 输出:
HOD
ELW
LOR

(注意:由于示例2的字符串长度不是4的倍数,因此最后一行可能不满4个箱子,但这不影响之字形摆放的规则。)

七、运行示例解析

输入解析
  • 输入字符串为 ABCDEFG 3
  • strings[0]ABCDEFG,表示字母串。
  • strings[1]3,表示每列的宽度。
代码逻辑解析
  1. 初始化

    • 创建一个 Scanner 对象 sc 来读取输入(尽管在这个例子中未使用)。
    • 读取输入行 line 并将其按空格分割成 strings 数组。
    • strings[1] 转换为整数 n,即每列的宽度为 3。
    • 创建一个 HashMap map,键为整数(表示列中的行索引),值为字符串(表示该行中的字符)。
  2. 处理字母串

    • 遍历字母串 letterStr 中的每个字符。
    • 计算当前字符的列索引 columnIdx,使用 i / n(整数除法)。
    • 根据列索引的奇偶性决定字符在行中的位置:
      • 偶数列(0, 2, …):字符按正序添加到行中。
      • 奇数列(1, 3, …):字符按倒序添加到行中。
    • 计算字符在行中的索引 index
      • 偶数列:index = i % n
      • 奇数列:index = n - 1 - i % n
    • 使用 map.getOrDefault(index, "") 获取当前行索引下的字符串(如果不存在则为空字符串)。
    • 将当前字符添加到该字符串的末尾,并更新 map
  3. 输出结果

    • 遍历 map,按行索引的顺序打印每行的字符串。
运行示例解析

输入:ABCDEFG 3

  • 字母串:ABCDEFG
  • 列宽:3

处理过程

  • 字符 A

    • 列索引 0(偶数列)
    • 行索引 0index = 0 % 3 = 0
    • map 更新为 {0=A}
  • 字符 B

    • 列索引 0(偶数列)
    • 行索引 1index = 1 % 3 = 1
    • map 更新为 {0=A, 1=B}
  • 字符 C

    • 列索引 0(偶数列)
    • 行索引 2index = 2 % 3 = 2
    • map 更新为 {0=A, 1=B, 2=C}
  • 字符 D

    • 列索引 1(奇数列)
    • 行索引 2index = 3 - 1 - (0 % 3) = 2,倒序)
    • map 更新为 {0=A, 1=B, 2=CD}
  • 字符 E

    • 列索引 1(奇数列)
    • 行索引 1index = 3 - 1 - (1 % 3) = 1,倒序)
    • map 更新为 {0=A, 1=BE, 2=CD}
  • 字符 F

    • 列索引 1(奇数列)
    • 行索引 0index = 3 - 1 - (2 % 3) = 0,倒序)
    • map 更新为 {0=AF, 1=BE, 2=CD}
  • 字符 G

    • 列索引 2(偶数列)
    • 行索引 0index = 3 % 3 = 0
    • map 更新为 {0=AFG, 1=BE, 2=CD}

输出结果

AFG
BE
CD
简单来说就是

以输入ABCDEFG 3为例,详细步骤如下:

  • 初始化哈希表为空。
  • 处理字符A:列索引0(偶数列),行索引0,更新哈希表为{0=A}
  • 处理字符B:列索引0(偶数列),行索引1,更新哈希表为{0=A, 1=B}
  • 处理字符C:列索引0(偶数列),行索引2,更新哈希表为{0=A, 1=B, 2=C}
  • 处理字符D:列索引1(奇数列),行索引2(从右到左),更新哈希表为{0=A, 1=B, 2=CD}
  • 处理字符E:列索引1(奇数列),行索引1(从右到左),更新哈希表为{0=A, 1=BE, 2=CD}
  • 处理字符F:列索引1(奇数列),行索引0(从右到左),更新哈希表为{0=AF, 1=BE, 2=CD}
  • 处理字符G:列索引2(偶数列),行索引0,更新哈希表为{0=AFG, 1=BE, 2=CD}
  • 输出结果:
    AFG
    BE
    CD
    

标签:map,之字形,字符,真题,index,OD,摆放,索引,字符串
From: https://blog.csdn.net/lbp0123456/article/details/144676625

相关文章

  • LeetCode题练习与总结:键盘行--500
    一、题目描述给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。请注意,字符串 不区分大小写,相同字母的大小写形式都被视为在同一行。美式键盘 中:第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成......
  • leetcode 541.反转字符串||
    看了一圈题解,好像没有c的解法,这里简单分享一下个人的做法:题目为:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则......
  • coderwhy_Vue3+TypeScript
    【公开课】coderwhy_Vue3+TypeScript.mp4Vue3+TypeScript王红元coderwhyke.qq.com/course/3453141?tuin1635c7de《TypeScript数据结构与算法》《React技术栈权威指南》作者腾讯AI高校训练营多所985、211名牌大学特聘讲师。丰富的软件开发和教学经验,带领团队开发出众多公司大......
  • Vscode安装使用小白教程(深度学习前置工具2024.12.27)
    这里是Vscode的下载安装和前期工作配置教程,基础讲解。首先我们直接在浏览器搜索Vscode点击下载点击是电脑window系统酒店这个点击这个,就可以下载。下载完成后双击安装不必改动直接安装即可。安装好之后右键快捷方式查看兼容性,勾选以管理员身份运行此程序。双击打开......
  • 【WPF】WPF 双向绑定中的 SelectedItem 与 ViewModel 属性更新机制详解
     在WPF开发中,ListBox等控件常用于显示绑定的数据集合,其中ItemsSource绑定的数据源,在没有显式设置 Mode 属性时,默认为单向绑定,它将数据源集合的内容传递给 ListBox,但不会反向更新数据源。而SelectedItem ,默认情况下它的绑定是双向的。这意味着当用户在 ListBox 中......
  • leetcode 826. 安排工作以达到最大收益
    826.安排工作以达到最大收益首先是自己写的构思代码classSolution{public:intmaxProfitAssignment(vector<int>&difficulty,vector<int>&profit,vector<int>&worker){sort(worker.begin(),worker.end());intn=difficulty.siz......
  • 【思维导图系列】Simple instructions: Source code quality defined in ISO26262
    MainstandardsregaringtheSWdesignandqualityassurance1).MISRACprogrammingrulesforembeddedcriticalsustems[MISRA-C:2004];2).HISsourcecodeMetricsforsoftwareevaluations[HIS];3).ASPICEforsoftwareprocessabdmanagement[ISO/IEC15504......
  • 大型语言模型(LLMs)演化树 Large Language Models
    大型语言模型(LLMs)演化树LargeLanguageModelsflyfish下面的图来自论文地址Transformer模型(如BERT和GPT-3)已经给自然语言处理(NLP)领域带来了革命性的变化。这得益于它们具备并行化能力(能够同时对输入数据的多个部分进行计算)、处理长距离依赖关系的能力(可以考虑并理解......
  • leetcode 870. 优势洗牌
    870.优势洗牌没做出啊......
  • 痞子衡嵌入式:MCUXpresso for VS Code开发环境搭建及SDK工程导入
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是MCUXpressoforVSCode开发环境搭建及SDK工程导入。MCUXpressoIDE(包括其前身LPCXpressoIDE、KinetisDesignStudio)是恩智浦软件团队持续开发了十多年的免费集成开发环境,现在功能已经相当完善,IDE里面......