大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
- 字符串处理
- Linux文件系统
- 单点(.)表示当前目录本身,不需要改变。
- 双点(..)表示切换到上一级目录,需要回到上一级目录。例如,当前路径为
/a/b/c
,使用双点(..)简化后得到/a/b
。 - 多个连续斜杠(/)会被视为一个斜杠,例如
///
和/
等价。 - 最后一个区域名(如果存在)不能以斜杠 '/' 结尾。
在Linux文件系统中,文件路径表示为一个由斜杠 '/' 分隔的字符串。类似于题目中的简化规则,Linux文件系统中的路径简化规则如下:
与题目类似,Linux文件系统中的路径简化也要始终以斜杠 '/' 开头。
题目解答方法的文字分析
这道题目考察的是字符串处理的技巧。我们需要根据题目规定的简化规则,对给定的绝对路径字符串进行处理,得到简化后的规范表示。
解题思路如下:
- 首先,我们将路径字符串按斜杠 '/' 进行分割,得到各个区域名,并保存在一个vector中。
- 然后,我们遍历vector中的区域名,根据简化规则对它们进行处理。
- 如果遇到单点(.),表示当前目录本身,不需要改变,直接跳过。
- 如果遇到双点(..),表示切换到上一级目录,我们需要将上一级目录从结果中删除,即从vector中弹出最后一个区域名。
- 其他情况下,区域名保持原样,直接添加到结果vector中。
- 最后,我们将简化后的区域名重新组合成字符串,即得到了简化后的规范表示。
本题解析所用的编程语言
C++
完整且正确的编程代码
#include <string> #include <vector> using namespace std; class Solution { public: string find_dangerous_cow_path(string path) { vector<string> parts; string part = ""; // 将路径字符串按斜杠 '/' 分割成各个区域名 for (char c : path) { if (c == '/') { // 遇到斜杠,将当前区域名添加到parts中,并清空part if (!part.empty()) { parts.push_back(part); part = ""; } } else { // 组合区域名 part += c; } } // 处理最后一个区域名 if (!part.empty()) { parts.push_back(part); } vector<string> simplified; // 根据简化规则处理区域名 for (const string& part : parts) { if (part == "..") { // 如果是双点,表示回到上一级目录,需要删除上一级的区域名 if (!simplified.empty()) { simplified.pop_back(); } } else if (part != ".") { // 其他情况保留区域名 simplified.push_back(part); } } // 组合简化后的区域名成为结果 string result = "/"; for (int i = 0; i < simplified.size(); ++i) { result += simplified[i]; if (i < simplified.size() - 1) { result += "/"; } } return result; } };