Leetcode 71 简化路径 (c++代码)

题目:

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

 

解题思路:

我的思路跟其他人的思路差不多,首先是将原先的数据按照‘/’分割开来,然后遇到‘.’就压入一个数据,遇到’..‘就抛掉最上面的数据,如果存储数据的变量为空,则不抛。

 

下面是我的代码,但是本地运行没问题,上传就有问题了。。。。。。

string simplifyPath(string path) {
	vector<char>  vec_sub;
	vector<vector<char>> vec_main;
	string re = "/";
	if (path.empty()){
		return re;
	}
	
	for (int i = 0; i < path.size(); i++){
			// 消除多个/影响
			while (path[i] == '/') i++;
			while (path[i] != '/'){
				vec_sub.push_back(path[i]);
				i++;
			}					
			bool flag;
			int DianCount=0;
			for (int j = 0; j < vec_sub.size(); j++){
				if (vec_sub[j] == '.'){
					DianCount++;
				}
			}
			if (DianCount > 1){
				vec_main.pop_back();
			}
			else{
				vec_main.push_back(vec_sub);
			}
			vec_sub.clear();
	}

	int n = vec_main.size();
	for (int i = 0; i < n; i++){
		vec_sub = vec_main[0];
		vec_main.pop_back();  
		for (int j = 0; j < vec_sub.size(); j++){
			re += vec_sub[j];
		}
		if (vec_main.empty()){
			return re;
		}
		re += '/';
	}
}

下面粘上一位大神的代码,大神是先将最初的字符串用stringstream + getline将原先的数据分割,之后一个个来进行处理,最终的结果是一样的。PS:见识到了getline的强大功能。

void split(string s, char delim, vector<string>& nodes) {
	string temp;
	stringstream ss(s);
	while (getline(ss, temp, delim)) {
		nodes.push_back(temp);
	}
}
string simplifyPath(string path) {
	vector<string> st;
	vector<string> nodes;
	string result;
	split(path, '/', nodes);
	for (auto node : nodes) {
		if (node == "" || node == ".")  continue;
		if (node == ".." && !st.empty())  st.pop_back();
		else if (node != "..")  st.push_back(node);
	}
	for (auto it : st) result += "/" + it;
	return result.empty() ? "/" : result;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值