当前位置: 首页 > article >正文

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

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

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

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

始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。

#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 将整数转换为字符串

#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 中的数据提取出来,做进一步的处理或输出。


http://www.kler.cn/news/273749.html

相关文章:

  • [Java、Android面试]_05_内存泄漏和内存溢出
  • K8s的概念
  • 云原生 PaaS 服务:构建现代应用的利器(分布式应用服务、配置中心、数据库服务、定时任务、实时监控、服务网关、技术组件)
  • 【备忘录】查询数据库中是否存在数据 的SQL语句性能对比和优化
  • 蓝桥杯算法基础(20):(快速排序的其他优化)java版
  • IDEA中的Project工程、Module模块的概念及创建导入
  • c++复数计算器
  • 陪诊系统有什么方便之处
  • 初次文件包含漏洞
  • 关于相机与镜头的选型
  • 使用ansible剧本进行lvm分盘
  • phpStudy安装thinkCMF8时,如何解决服务器rewrite和APIrewrite不支持的问题
  • UGUI源码分析与研究1-UGUI底层的实现原理
  • Java后端面试:框架篇高频面试(Spring、SpringMVC、SpringBoot、MyBatis)
  • 【渗透工具】BurpSuite汉化无cmd框版安装教程
  • Flutter-自定义图片3D画廊
  • 蓝桥杯刷题总结(Python组)
  • 信雅纳网络测试的二次开发集成:XOA(Xena Open-Source Automation)开源自动化测试
  • 目标检测——YOLOv5算法解读
  • 高架学习笔记之信息系统分类概览
  • 比较两个数组对象,找出属性id相同的项并删除
  • P8711 [蓝桥杯 2020 省 B1] 整除序列 存疑解决篇 Python
  • 爬虫技术实战案例解析
  • Java基础知识总结(6)
  • 超分之SwinIR
  • 【NLP学习记录】One-Hot编码
  • 电商api数据接口技术开发来赞达lazada通过商品ID抓取商品详情信息item_get请求key接入演示
  • 代码随想录--排序算法
  • LeetCode 面试经典150题 27.移除元素
  • 如何搭建“Docker Registry私有仓库,在CentOS7”?