华为OD机试 2024D卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。
支持命令:
- 创建目录命令:mkdir 目录名称,如mkdir abc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。
- 进入目录命令:cd 目录名称,如cd abc为进入abc目录,特别地,cd …为返回上级目录,如果目录不存在则不执行任何操作。此命令无输出。
- 查看当前所在路径命令:pwd,输出当前路径字符串。
约束:
- 目录名称仅支持小写字母;mkdir和cd命令的参数仅支持单个目录,如mkdir abc和cd abc;不支持嵌套路径和绝对路径,如mkdir abc/efg,cd abc/efg是不支持的。
- 目录符号为/,根目录/作为初始目录。
- 任何不符合上述定义的无效命令不做任何处理并且无输出。
二、输入描述
输入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)来管理当前目录层级。具体步骤如下:
- 输入解析:读取所有命令并存储在列表中。
- 处理命令:遍历命令列表,处理 mkdir、cd 和 pwd 命令。
- 栈操作:
- mkdir:不实际存储目录结构,只需忽略。
- cd 目录名称:将目录名称推入栈中,表示进入该目录;如果是 cd …,则弹出栈顶,表示返回上级目录。
- pwd:遍历栈,构建当前路径字符串,并记录最后一次 pwd 命令的结果。
- 输出结果:输出最后一次 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在线答疑。