华为OD机试真题-模拟项目管理-2024
#include <iostream> #include <vector> #include <unordered_map> #include <string> std::vector<std::string> SplitString(std::string& str, const std::string& reg) { std::string::size_type posLast = 0; std::string::size_type posCurrent = str.find(reg); std::vector<std::string> result; while (posCurrent != std::string::npos) { result.push_back(str.substr(posLast, posCurrent - posLast)); posLast = posCurrent + reg.length(); posCurrent = str.find(reg, posLast); } if (posLast < str.length()) { result.push_back(str.substr(posLast)); } return result; } //构建文件管理class, 每一个目录是一个节点, 每一个目录节点可能包含子目录节点 class FileSystem { struct Directory { std::unordered_map<std::string, Directory*> mapChildren; }; Directory* root; //根目录 Directory* current; //当前目录 std::string currentPath; //当前地址 public: FileSystem() { root = new Directory; current = root; currentPath="/"; } public: void Mkdir(const std::string& dir) { if (current->mapChildren.find(dir) == current->mapChildren.end()) { current->mapChildren[dir] = new Directory; } } void Cd(const std::string& dir,const std::string& directoryTag) { if (dir == "..") { //不是根目录 if (current != root) { int pos=currentPath.rfind(directoryTag.c_str()[0], currentPath.length() - 2); // /a/b/c/ ---> 最后一个/出现的位置 currentPath= currentPath.substr(0, pos+1); current = root; std::vector<std::string> strs = SplitString(currentPath, directoryTag); for (const std::string& item : strs) { if (!item.empty() && current->mapChildren.find(item) != current->mapChildren.end()) { current = current->mapChildren[item]; } } } } else { if (current->mapChildren.find(dir) == current->mapChildren.end()) return; currentPath = currentPath + dir + directoryTag; current = current->mapChildren[dir]; } } std::string Pwd(const std::string& str) { return currentPath; } }; bool CheckDirectory(const std::string& str, const std::string& directoryTag) { if (str.find(directoryTag) != std::string::npos) { return false; } return true; } void main() { std::string result; const std::string mkdirString = "mkdir"; const std::string cdString = "cd"; const std::string pwdString = "pwd"; const std::string directoryTag="/"; FileSystem fileSys; std::string str; while (std::getline(std::cin, str)) { //如果是创建目录命令 if (str.find(mkdirString) != std::string::npos) { std::string::size_type pos = str.find(mkdirString); std::string dir = str.substr(pos + mkdirString.length() + 1); if (CheckDirectory(dir, directoryTag)) { fileSys.Mkdir(dir); } } else if (str.find(cdString) != std::string::npos) //如果是打开目录命令 { std::string::size_type pos = str.find(cdString); std::string dir = str.substr(pos + cdString.length() + 1); if (CheckDirectory(dir, directoryTag)) { fileSys.Cd(dir, directoryTag); } } else if (str.find(pwdString) != std::string::npos) { std::string::size_type pos = str.find(cdString); std::string dir = str.substr(pos + cdString.length() + 1); if (CheckDirectory(dir, directoryTag)) { std::string res=fileSys.Pwd(dir); std::cout << res << std::endl; } } } }
华为OD2024 E 文章被收录于专栏
实时更新华为2024 E卷答案