leetcode 简化路径

问题描述:

/a/b/../../c简化后为/c

/a//b././简化后为/c

问题解析:将字符串转换为istringstream流,进行字符串分割,是"..”并且进入一层目录,则进行回退(pop_back),如果是目录,则保存目录;如果是“..”并且没有目录级可回退,则在根目录下;若为“.”或者为空(两个//)则跳过

使用getline对字符串进行分割,函数原型为:

istream& getline (char* s, streamsize n );

istream& getline (char* s, streamsize n, char delim );

作用:作用是从istream中读取至多n个字符保存在s对应的数组中。即使还没读够n个字符,如果遇到换行符'\n'(第一种形式)或delim(第二种形式),则读取终止,'\n'或delim都不会被保存进s对应的数组中。

getline(cin,str);从输入流中读取一行,并保存读取内容到str中,不包括换行符。

#include<string>
#include<vector>
#include<sstream>
#include<iostream>
using namespace std;
string simplifyPath(string path) {
	istringstream ss(path);
	string s;
	vector<string>res;
	while (getline(ss, s, '/')){
		if (s==""||s=="."){
			continue;
		}
		else if (s == ".." && !res.empty()){
			res.pop_back();
		}
		else if(s!=".."){
			res.push_back(s);
		}
    }
	string way;
	for (int i = 0; i < res.size(); i++){
		way += "/" + res[i];
	}

	return res.empty()?"/":way;
}
int main()
{
	string s = "/a/b/c../..///d./d/s";
	string res = simplifyPath(s);
	cout << res << endl;
	system("pause");
}

参考:https://www.nowcoder.com/questionTerminal/393e5a246a7546d1b2e4d7719647b7d9

猜你喜欢

转载自blog.csdn.net/liugg2016/article/details/81871424
今日推荐