华为OD机试 - 模拟目录管理 - 栈(Java 2024 D卷 100分)

在这里插入图片描述

华为OD机试 2024D卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。

支持命令:

  1. 创建目录命令:mkdir 目录名称,如mkdir abc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。
  2. 进入目录命令:cd 目录名称,如cd abc为进入abc目录,特别地,cd …为返回上级目录,如果目录不存在则不执行任何操作。此命令无输出。
  3. 查看当前所在路径命令:pwd,输出当前路径字符串。

约束:

  1. 目录名称仅支持小写字母;mkdir和cd命令的参数仅支持单个目录,如mkdir abc和cd abc;不支持嵌套路径和绝对路径,如mkdir abc/efg,cd abc/efg是不支持的。
  2. 目录符号为/,根目录/作为初始目录。
  3. 任何不符合上述定义的无效命令不做任何处理并且无输出。

二、输入描述

输入N行字符串,每一行字符串是一条命令

三、输出描述

输出最后一条命令运行结果字符串。

补充说明:

命令行数限制100行以内,目录名称限制10个字符以内。

四、测试用例

1、输入

mkdir abc
cd abc
pwd

2、输出

/abc/

3、输入

mkdir test
cd test
mkdir example
cd example
cd …
pwd

4、输出

/test/

5、说明

  • mkdir test 创建了目录 test。
  • cd test 进入目录 test。
  • mkdir example 在 test 目录下创建了目录 example(该命令实际不影响路径管理)。
  • cd example 进入目录 example。
  • cd … 返回上级目录 /test/。
  • pwd 输出当前路径 /test/。

在这里插入图片描述

五、解题思路

为了模拟目录管理功能,我们可以使用栈(Stack)来管理当前目录层级。具体步骤如下:

  1. 输入解析:读取所有命令并存储在列表中。
  2. 处理命令:遍历命令列表,处理 mkdir、cd 和 pwd 命令。
  3. 栈操作:
    • mkdir:不实际存储目录结构,只需忽略。
    • cd 目录名称:将目录名称推入栈中,表示进入该目录;如果是 cd …,则弹出栈顶,表示返回上级目录。
    • pwd:遍历栈,构建当前路径字符串,并记录最后一次 pwd 命令的结果。
  4. 输出结果:输出最后一次 pwd 命令的结果。

六、Java算法源码

package com.nezha.od;

import java.util.*;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<String> commands = new ArrayList<>();

        // 读取输入命令
        while (sc.hasNextLine()) {
            String line = sc.nextLine().trim();
            if (line.isEmpty()) break;
            commands.add(line);
        }

        // 调用处理命令的方法并输出结果
        String result = processCommands(commands);
        System.out.println(result);

        sc.close();
    }

    /**
     * 处理命令序列并返回最后一条 pwd 命令的结果
     * @param commands 命令列表
     * @return 最后一条 pwd 命令的结果
     */
    public static String processCommands(List<String> commands) {
        // 使用栈管理目录层级
        Stack<String> pathStack = new Stack<>();
        pathStack.push("/"); // 根目录

        String lastPwdResult = "";

        for (String command : commands) {
            // 处理 mkdir 命令
            if (command.startsWith("mkdir ")) {
                // mkdir 命令忽略,因为不需要实际存储目录结构
            }
            // 处理 cd 命令
            else if (command.startsWith("cd ")) {
                String dirName = command.substring(3); // 提取目录名称
                if (dirName.equals("..")) {
                    if (pathStack.size() > 1) {
                        pathStack.pop(); // 返回上级目录
                    }
                } else if (!dirName.isEmpty() && dirName.length() <= 10) {
                    pathStack.push(dirName); // 进入指定目录
                }
            }
            // 处理 pwd 命令
            else if (command.equals("pwd")) {
                lastPwdResult = getCurrentPath(pathStack); // 获取当前路径
            }
        }
        return lastPwdResult;
    }

    /**
     * 获取当前路径字符串
     * @param pathStack 目录栈
     * @return 当前路径字符串
     */
    public static String getCurrentPath(Stack<String> pathStack) {
        StringBuilder path = new StringBuilder();
        for (String dir : pathStack) {
            if (!dir.equals("/")) {
                path.append(dir).append("/");
            } else {
                path.append(dir);
            }
        }
        return path.toString();
    }
}

七、效果展示

1、输入

mkdir abc
mkdir def
cd abc
mkdir xyz
cd …
cd def
pwd

2、输出

/def/

3、说明

  • mkdir abc 和 mkdir def 创建了目录 abc 和 def。
  • cd abc 进入目录 abc。
  • mkdir xyz 在 abc 目录下创建了目录 xyz(该命令实际不影响路径管理)。
  • cd … 返回上级目录 /。
  • cd def 进入目录 def。
  • pwd 输出当前路径 /def/。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值