一. 这题想到用栈去化简,但是一直不太对.因此直接看题解学习一下.
二. 参考
题解的都不太能看得懂,于是参考了博客中的一篇题解.
版权声明:本文为CSDN博主「coordinate_blog」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17550379/article/details/80802176
解题思路
1. 思路很简单,我们首先使用path.split('/')
将字符串切开,然后判断path.split('/')
中每个元素。如果=='.'
,我们继续判断下一个。如果=='..'
,我们len(stack) != 0
,弹出一个元素。否则我们将这个元素添加到stack
中。
2. 附上大神的代码.
3. <sstream> 定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。
更多的可以参考https://blog.csdn.net/liitdar/article/details/82598039博客.
4. 在<string>中的getline函数有四种重载形式.
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream& is, string& str); istream& getline (istream&& is, string& str);
用法和上第一种类似,但是读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。
函数的变量:
is :表示一个输入流,例如cin。
str :string类型的引用,用来存储输入流中的流信息。
delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。
版权声明:本文为CSDN博主「_小尴尬_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MisterLing/article/details/51697098
class Solution
{
public:
string simplifyPath(string path)
{
string result, tmp;
//定义一个数组,栈不太好用,因为待会如果遇到..需要弹出元素.
vector<string> st;
//定义输入输出流,初始化为path.
stringstream s(path);
//getline到'/'终止,并把前面有效的字符串保存到tmp中.
//相当于python的split函数.
//getline返回的是流是否有效,因此不会退出.
while (getline(s, tmp, '/'))
{
if (tmp == "." || tmp == "") continue;
else if (tmp == "..")
{
if (!st.empty()) st.pop_back();
}
else
{
st.push_back(tmp);
}
}
for(auto& i:st) {
result += "/" + i;
}
return result.empty() ? "/" : result;
}
};
学习到的东西很多需要经常复习.