前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。
支持命令:
- 创建目录命令:mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。
- 进入目录命令:cd 目录名称,如 cd abc 为进入abc目录,特别地,cd .. 为返回上级目录,如果目录不存在则不执行任何操作。此命令无输出。
- 查看当前所在路径命令:pwd,输出当前路径字符串。
约束:
目录名称仅支持小写字母;
mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc;
不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。
目录符号为/,根目录/作为初始目录。任何不符合上述定义的无效命令不做任何处理并且无输出。
输入描述
输入 N 行字符串,每一行字符串是一条命令。
输出描述
输出最后一条命令运行结果字符串。
备注
命令行数限制100行以内,目录名称限制10个字符以内。
用例
用例1
输入
mkdir abc
cd abc
pwd
输出
/abc/
说明:在根目录创建一个abc的目录并进入abc目录中查看当前目录路径,输出当前路径/abc/
解题思路
创建Dir对象,实现mkdir、pwd、cd 方法。
题解 (java + python)
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
* @author arnold
*
* @date 2024年12月08日
*
*/
public class T2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MyDir dir = new MyDir();
while(sc.hasNextLine()) {
String line = sc.nextLine();
String[] cmd = line.split(" ");
if (cmd[0].equals("pwd")) {
String path= dir.pwd();
System.out.println(path);
} else if (cmd[0].equals("cd")) {
dir = dir.cd(cmd[1]);
} else if (cmd[0].equals("mkdir")) {
dir.mkdir(cmd[1]);
}
}
}
static class MyDir{
String name;
List<MyDir> children;
MyDir parent;
public MyDir() {
super();
this.name = ""; // 根节点
}
/**
* @param name
* @param parent
*/
public MyDir(String name, MyDir parent) {
super();
this.name = name;
this.parent = parent;
}
public String pwd(){
// 判断父级是否为空,为空则为根节点
if(this.parent == null) {
return "/";
}
// 逐级向上遍历,获取文件夹名称, 并存入集合
List<String> dirs = new ArrayList<>();
dirs.add(this.name);
MyDir p = parent;
while(p != null) {
dirs.add(p.name);
p = p.parent;
}
// 对集合进行反转,按根节点在前进行打印
Collections.reverse(dirs);
return String.join("/", dirs) + "/";
}
// cd方法需要返回目标目录,用于后续其他对目录的操作
public MyDir cd(String name) {
if (name == null) {
return this;
} else if (name.equals("..")) {
return this.parent == null? this : this.parent;
} else {
if(this.children != null ) {
for (MyDir d: children) {
if (d.name.equals(name)) {
return d;
}
}
}
}
return this;
}
public void mkdir(String name) {
if (name != null) {
if (this.children == null) {
this.children = new ArrayList<>();
}
this.children.add(new MyDir(name, this));
}
}
}
python
'''
Created on 2024年12月8日
@author: arnold
'''
import sys
class Dir:
name = ""
children = None
parent = None
def __init__(self, name, parentDir):
self.name = name
self.parent = parentDir
def pwd(self):
# 判断父级是否为空,为空则为根节点
if self.parent == None:
return "/";
# 逐级向上遍历,获取文件夹名称, 并存入集合
dirs = [];
dirs.append(self.name);
p:Dir = self.parent;
while p != None:
dirs.append(p.name);
p = p.parent;
# 对集合进行反转,按根节点在前进行打印
dirs.reverse()
return "/".join(dirs) + "/";
# cd方法需要返回目标目录,用于后续其他对目录的操作
def cd(self, name):
if name == None:
return self
elif name == "..":
return self if self.parent == None else self.parent;
else:
if self.children != None:
for d in self.children:
if d.name == name:
return d
return self;
def mkdir(self, name):
if name != None:
if self.children == None:
self.children = [];
self.children.append( Dir(name, self) );
if __name__ == '__main__':
dir = Dir("", None)
for line in sys.stdin:
tmp = line.split()
if tmp[0] == "pwd":
path = dir.pwd();
print(path)
elif tmp[0] == "cd":
dir = dir.cd(tmp[1])
elif tmp[0] == "mkdir":
dir.mkdir(tmp[1])
else:
pass