LeetCode 71

              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;
	}
};
請注意仔細看看註釋部分,因爲有些情況的結果可能跟我們預想的不他一樣,所以只能按照題目給的方向來解決了,下面是運行結果:


(最後解析一下爲什麼好久沒有寫博客了,因爲我去實習了,所以沒有時間來寫博客了,今天是完成了任務以後抽出時間來寫的,不過寫完了也到半夜了,最近可能不會每天都寫博客了,但是應該每週都會寫一些吧)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章