Simplify Path
這個題是給出一個字符串的相對路徑,讓我們返回絕對路徑,讓我們在Linux下自己去動手操作確實不難,可是用程序做起來的話確實比較麻煩。
我的解題思路是找好‘/’和‘.’之間的關係,找好他們之間的組合關係後這個題就容易一些。在路徑中‘.’和‘/’的組合正常的可能只有‘.’和‘..’兩種。‘/’是起修飾作用的,說明當前目錄下可能還存在目錄。
既然我們要寫這個題的話,那麼肯定會出現各種組合的情況,其實我們只要處理好兩種正常的情況就差不多了,其他的情況稍微注意一下就可以了。下面就先看看我的代碼吧!
class Solution
{
public:
string simplifyPath(string path)
{
stack<char> S;
string aPath = ""; //返回串
if (path.size() == 0)
{
return aPath;
}
int Status = 0; //保存當前‘.’的個數
int i = 0;
int sz = path.size();
char visited = 0; //最近訪問的符號
int Dir = 0; //當前目錄個數
while (i<sz)
{
if (path[i] == '.')
{ //統計連續‘.’的數目
++Status;
while (++i < sz && path[i] == '.')
++Status;
visited = '.';
}
if (i < sz && path[i] == '/')
{
if (Status == 0)
{
if (visited != '/' && S.size()!=1) //防止連續‘/’或者‘/’複製錯誤 /../ -> /
{
S.push('/');
visited = '/';
}
}
else if (Status == 1) //當前目錄
{
visited = '/';
Status = 0;
}
else if (Status == 2)
{
if (!S.empty() && Dir > 0) // 存在目錄則返回上級目錄
{
S.pop();
while (!S.empty() && S.top() != '/')
{
S.pop();
}
--Dir;
visited = '/';
}
else if (S.empty())
{
S.push('/');
visited = '/';
}
Status = 0;
}
else
{
while (Status--) //目錄之前的‘.’
S.push('.');
S.push('/');
visited = '/';
Status = 0;
}
}
else
{
if (i < sz)
{
while (Status--)
S.push('.');
Status = 0;
while (i < sz && path[i] != '/' && path[i] != '.') //完整目錄
{
S.push(path[i]);
visited = path[i];
++i;
}
++Dir;
if (path[i] == '/' || path[i] == '.') //往回退一個位置
--i;
visited = path[i];
}
}
++i;
}
if (Status > 0)
{
if (Status == 1)
{
//do nothing
}
else if (Status == 2)
{ // 2
if (!S.empty() && Dir > 0) //末尾可能出現上級目錄 /a/.. -> /
{
S.pop();
while (!S.empty() && S.top() != '/')
{
visited = S.top();
S.pop();
}
--Dir;
}
}
else
{ // > 2
while (Status--)
S.push('.');
Status = 0;
}
}
while (!S.empty()) //將棧裏面的內容取出來
{
char ch = S.top();
string tmp = "";
tmp += ch;
aPath = tmp + aPath;
S.pop();
}
if (aPath.size() > 1)
{
int end = aPath.size() - 1;
while (end > 0 && aPath[end--] == '/') //末尾位置的‘/’應該去掉
aPath.pop_back();
}
return aPath;
}
};
請注意仔細看看註釋部分,因爲有些情況的結果可能跟我們預想的不他一樣,所以只能按照題目給的方向來解決了,下面是運行結果:
(最後解析一下爲什麼好久沒有寫博客了,因爲我去實習了,所以沒有時間來寫博客了,今天是完成了任務以後抽出時間來寫的,不過寫完了也到半夜了,最近可能不會每天都寫博客了,但是應該每週都會寫一些吧)