Simplify Path
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
Input : /.. Output: /
分析:
本题个人觉得更多的是考查语言分割函数的使用。
C++中string分割函数可以用stringstream+getline来实现分割功能。istream& getline (istream& is, string& str, char delim);
C语言中对于char * 可以使用strtok来进行分割。循环进行直到取出所有字符串。
举例:出自: [C/C++标准库]_[初级]_[分割字符串Split]
void TestStrtok()
{
//1.非线程安全的,如果多个线程同时调用,会覆盖掉原来的值.
//2.支持以字符串分割.
//3.源字符串必须是可修改的.
char c_str[]="google||twitter||facebook||microsoft||apple||ibm||";
const char* delim = "||";
char* result = strtok(c_str,delim);
while(result != NULL)
{
cout << result << endl;
result = strtok(NULL,delim);
}
}
void TestGetLineWithStringStream()
{
//1.线程安全的,但是只能以字符作为分隔符
stringstream ss("google|twitter|facebook|microsoft|apple|ibm|");
string str;
while(getline(ss,str,'|'))
{
cout << str << endl;
}
}
class Solution {
public:
string simplifyPath(string path) {
stack<string> st;
stringstream ss(path);
string str;
string res="";
st.push("/");
while(getline(ss,str,'/'))
{
if(str==""||str==".")continue;
else if(str==".."){
if(st.top()!="/")
st.pop();
}
else
st.push(str);
}
if(st.top()=="/")return "/";
while(!st.empty()){
if(st.top()!="/"){
res.insert(0,'/'+st.top());
}
st.pop();
}
return res;
}
};