【C++】每日一题 71 简化路径

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (...) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 '/' 开头。

两个目录名之间必须只有一个斜杠 '/' 。

最后一个目录名(如果存在)不能 以 '/' 结尾。

此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '...')。

返回简化后得到的 规范路径 。

cpp 复制代码
#include <iostream>
#include <sstream>
#include <vector>

std::string simplifyPath(std::string path) {
    std::vector<std::string> stack;
    std::stringstream ss(path);
    std::string dir;

    while (getline(ss, dir, '/')) {
        if (dir.empty() || dir == ".") {
            // Do nothing (current directory or empty)
        } else if (dir == "..") {
            if (!stack.empty()) {
                stack.pop_back();
            }
        } else {
            stack.push_back(dir);
        }
    }

    std::string result = "";
    for (const std::string& dir : stack) {
        result += "/" + dir;
    }

    return result.empty() ? "/" : result;
}

int main() {
    std::string path = "/home//foo/";
    std::string simplifiedPath = simplifyPath(path);

    std::cout << "Simplified Path: " << simplifiedPath << std::endl;

    return 0;
}

在这段 C++ 代码中,我们使用一个字符串流 std::stringstream 来逐个读取路径中的每个目录名,并根据规则进行处理。具体步骤如下:

  1. 将路径按照 '/' 分割,并遍历每个目录名 dir。
  2. 如果 dir 为空或为.,表示当前目录,不做任何操作。
  3. 如果 dir 为...,表示返回上一级目录,则弹出栈顶元素。
  4. 否则,将非空且不为.或...的目录名压入栈中。
  5. 最后,我们将栈中的目录名按照规范拼接起来,并返回简化后的规范路径。

补充:

std::stringstream 是 C++ 标准库中的一个类,用于在内存中创建一个可读写的字符序列。它主要用于将各种数据类型(如整数、浮点数、字符串等)转换为字符串,或者将字符串解析为各种数据类型。

std::stringstream 类通常用于以下两个方面:

数据类型转换: 可以使用 std::stringstream 将其他数据类型(如整数、浮点数)转换为字符串,或将字符串转换为其他数据类型。

字符串操作: 可以将多个字符串拼接成一个字符串,或者从一个字符串中提取需要的信息。

在 C++ 中,std::stringstream 提供了类似于输入输出流的操作符 << 和 >>,这使得它可以方便地用于将数据类型转换为字符串或从字符串中提取数据。

下面是一个简单的示例,演示如何使用 std::stringstream 将整数转换为字符串

cpp 复制代码
#include <iostream>
#include <sstream>

int main() {
    int num = 42;
    std::stringstream ss;
    ss << num; // 将整数转换为字符串

    std::string strNum = ss.str(); // 获取转换后的字符串
    std::cout << "Converted string: " << strNum << std::endl;

    return 0;
}

创建了一个 std::stringstream 对象 ss,并使用 << 操作符将整数 num 转换为字符串。然后,通过调用 ss.str() 方法,获取了转换后的字符串并输出。

在 C++ 的标准库中,std::stringstream 类包含一个名为 str() 的成员函数,用于获取 std::stringstream 对象中当前存储的字符串值。这个函数返回一个 std::string 对象,其中包含了 std::stringstream 中的内容。

当你向 std::stringstream 对象写入数据(使用 << 操作符)或从中读取数据时,这些数据会被存储在内部缓冲区中。通过调用 str() 函数,你可以获取整个缓冲区中的内容,并以字符串形式返回。这样你就可以方便地将 std::stringstream 中的数据提取出来,做进一步的处理或输出。

相关推荐
007php00716 分钟前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
Mr.Jessy18 分钟前
Web APIs学习第一天:获取 DOM 对象
开发语言·前端·javascript·学习·html
午安~婉19 分钟前
javaScript八股问题
开发语言·javascript·原型模式
想不明白的过度思考者26 分钟前
Rust——异步递归深度指南:从问题到解决方案
开发语言·后端·rust
芝麻开门-新起点1 小时前
flutter 生命周期管理:从 Widget 到 State 的完整解析
开发语言·javascript·ecmascript
我先去打把游戏先2 小时前
ESP32开发指南(基于IDF):连接AWS,乐鑫官方esp-aws-iot-master例程实验、跑通
开发语言·笔记·单片机·物联网·学习·云计算·aws
郭源潮12 小时前
《Muduo网络库:实现TcpServer类终章》
服务器·网络·c++·网络库
逻极2 小时前
Rust数据类型(上):标量类型全解析
开发语言·后端·rust
Zhangzy@2 小时前
Rust 编译优化选项
android·开发语言·rust
百锦再2 小时前
第2章 第一个Rust程序
java·开发语言·后端·rust·eclipse·tomcat·hibernate