华为OD机试-2024年E卷-模拟目录管理 JAVA

图中题和这个类似:

* 题目描述
* 实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。支持命令:创建目录命令: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/

不支持嵌套目录的写法如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//同OJTest2
class DirNode {
    private String dirName; //定义当前节点的目录名称
    private DirNode parent;//定义父类的Node节点
    private List<DirNode> children; //定义子类的节点列表,可能有多个同级子目录

    public DirNode(String dirName) {
        this.dirName = dirName;
        parent = null;
        children = new ArrayList<>();
    }

    public void addChildren(DirNode node) {
        children.add(node);
        node.parent = this;
    }

    public String getDirName() {
        return dirName;
    }


    public DirNode getParent() {
        return parent;
    }

    public List<DirNode> getChildren() {
        return children;
    }
}

class DirectoryDir {
    DirNode root;

    public DirectoryDir() {
        this.root = new DirNode("/");
    }

    public void mkdir(String path) {
        if (path.startsWith("/")) {
            path = path.substring(1);
        }
        if (!path.contains("/")) { //如果path中没有嵌套目录的话,才能在当前root节点下创建目录
            boolean flag = false;
            for (DirNode child : root.getChildren()) {
                if (child.getDirName().equals(path)) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                DirNode node = new DirNode(path);
                root.addChildren(node);
            }
        }
    }

    public void cd(String path) {
        if (path.equals("..")) {
            if (root.getParent() != null) {
                root = root.getParent();
            }
        } else {
            if (path.startsWith("/")) {
                path = path.substring(1);
            }
            if (!path.contains("/")) {
                DirNode current = root;
                for (DirNode child : current.getChildren()) {
                    if (child.getDirName().equals(path)) {
                        current = child;
                        break;
                    }
                }
                root = current;
            }
        }
    }

    public String pwd() {
        StringBuilder bd = new StringBuilder();
        DirNode current = root;
        List<String> lists = new ArrayList<>();
        if (!current.getDirName().equals("/")) { //如果当前不在根目录
            do {
                lists.add(current.getDirName());
                current = current.getParent();
            } while (current != null);
        } else {
            return bd.append("/").toString();
        }
        for (int i = lists.size() - 1; i >= 0; i--) {
            bd.append(lists.get(i)).append("/");
        }
        return bd.substring(1);
    }
}

public class DirManage {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        DirectoryDir directoryTree = new DirectoryDir();
        while (in.hasNextLine()) {
            String command = in.nextLine();
            if (command.startsWith("mkdir")) {
                String dirName = command.split(" ")[1];
                directoryTree.mkdir(dirName);
            } else if (command.startsWith("cd")) {
                String dirName = command.split(" ")[1];
                directoryTree.cd(dirName);
            } else if (command.equals("pwd")) {
                System.out.println(directoryTree.pwd());
            }
        }
    }
}

支持嵌套创建目录和嵌套cd目录的方式如下:


class DirectoryNode {
    private String dirName; //定义目录名称
    private DirectoryNode parent; //定义父节点
    private List<DirectoryNode> children; //定义孩子节点

    public DirectoryNode(String dirName) {
        this.dirName = dirName;
        this.parent = null;
        this.children = new ArrayList<>();
    }

    //添加子目录节点
    public void addChild(DirectoryNode node) {
        children.add(node);
        node.parent = this;
    }

    //获取当前目录名称
    public String getDirName() {
        return dirName;
    }

    //获取父目录节点
    public DirectoryNode getParent() {
        return parent;
    }

    //获取子目录节点
    public List<DirectoryNode> getChildren() {
        return children;
    }
}

class DirectoryTree {
    private DirectoryNode root;

    public DirectoryTree() {
        this.root = new DirectoryNode("/");
    }

    //创建目录
    public void mkdir(String path) {
        if (path.startsWith("/")) {
            path = path.substring(1);
        }
        String[] dirNames = path.split("/");
        DirectoryNode current = root;
        for (String dirName : dirNames) {
            boolean found = false;
            for (DirectoryNode child : current.getChildren()) {
                if (child.getDirName().equals(dirName)) {
                    current = child;
                    found = true;
                    break;
                }
            }
            if (!found) {
                DirectoryNode newDir = new DirectoryNode(dirName);
                current.addChild(newDir);
                current = newDir;
            }
        }
    }

    public void cd(String path) {
        if (path.equals("..")) { //向后退一层目录到当前的parents层
            if (root.getParent() != null) {
                root = root.getParent();
            }
        } else { //进入到目录里
            if (path.startsWith("/")) {
                path = path.substring(1);
            }
            String[] dirNames = path.split("/");
            DirectoryNode current = root;
            for (String dirName : dirNames) {
                for (DirectoryNode child : current.getChildren()) {
                    if (child.getDirName().equals(dirName)) {
                        current = child;
                        break;
                    }
                }
            }
            root = current;
        }
    }

    public String pwd() {
        StringBuilder currentPath = new StringBuilder();
        DirectoryNode current = root;
        List<DirectoryNode> pathNodes = new ArrayList<>();
        while (current != null) {
            pathNodes.add(current);
            current = current.getParent();
        }
        for (int i = pathNodes.size() - 1; i >= 0; i--) {
            currentPath.append(pathNodes.get(i).getDirName()).append("/");
        }
        return currentPath.substring(1);
    }
}

public class OJTest2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        DirectoryTree directoryTree = new DirectoryTree();

        while (in.hasNextLine()) {
            String command = in.nextLine();
            if (command.startsWith("mkdir")) {
                String dirName = command.split(" ")[1];
                directoryTree.mkdir(dirName);
            } else if (command.startsWith("cd")) {
                String dirName = command.split(" ")[1];
                directoryTree.cd(dirName);
            } else if (command.equals("pwd")) {
                System.out.println(directoryTree.pwd());
            }
        }
        in.close();
    }
}

全部评论

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
迷茫的大四🐶:都收获五个了,兄弟那还说啥,不用改了,去玩吧
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务