华为OD E卷(200分)02-模拟目录管理

前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

arnold66

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

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

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

打赏作者

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

抵扣说明:

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

余额充值