【算法一则】做算法学数据结构 - 简化路径 - 【栈】

news2024/11/29 2:30:39

目录

  • 题目
  • 代码
  • 题解

题目

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

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

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

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

示例 1:

输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。 
示例 2:

输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:

输入:path = "/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:

输入:path = "/a/./b/../../c/"
输出:"/c"
提示:

1 <= path.length <= 3000
path 由英文字母,数字,'.','/' 或 '_' 组成。
path 是一个有效的 Unix 风格绝对路径。

在这里插入图片描述

栈是一种常见的数据结构,它遵循先进后出(LIFO)的原则。栈有两个主要的操作:入栈(push)和出栈(pop)。入栈操作将元素放入栈的顶部,出栈操作将栈顶的元素移除并返回。

以下是一个简单的栈的Java实现示例:

import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.List;

public class Stack<T> {
    private List<T> stackList;

    public Stack() {
        stackList = new ArrayList<>();
    }

    public void push(T element) {
        stackList.add(element);
    }

    public T pop() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        int lastIndex = stackList.size() - 1;
        T element = stackList.get(lastIndex);
        stackList.remove(lastIndex);
        return element;
    }

    public T peek() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        return stackList.get(stackList.size() - 1);
    }

    public boolean isEmpty() {
        return stackList.isEmpty();
    }

    public int size() {
        return stackList.size();
    }
}

上述代码中,我们使用一个 List 来存储栈中的元素。push 方法将元素添加到列表的末尾,pop 方法从列表的末尾移除元素并返回它。peek 方法返回栈顶的元素而不移除它。isEmpty 方法用于检查栈是否为空,size 方法返回栈的大小。

使用该栈的示例:

public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);

        System.out.println(stack.pop());  // 输出:3
        System.out.println(stack.peek()); // 输出:2
        System.out.println(stack.size()); // 输出:2
        System.out.println(stack.isEmpty()); // 输出:false
    }
}

上述示例展示了栈的基本操作,包括入栈、出栈、查看栈顶元素、获取栈的大小以及检查栈是否为空。

代码

public String simplifyPath(String path) {
    String[] split = path.split("/");
    Stack<String> stack = new Stack<>();
    Arrays.stream(split).forEach(s -> {
        if (s.equals("..")) {
            if (!stack.isEmpty()) {
                stack.pop();
            }
        } else if (!s.equals(".") && !s.equals("")) {
            stack.push(s);
        }
    });
    if (stack.size() > 0) {
        String lastElement = stack.lastElement();
        if (lastElement.equals("/")) {
            stack.remove(stack.size() - 1);
        }
    }

    StringBuilder sb = new StringBuilder();
    for (String s : stack) {
        sb.append("/").append(s);
    }
    return sb.toString().length() == 0 ? "/" : sb.toString();
}

题解

这段Java代码实现了简化文件路径的功能。给定一个字符串路径,例如 “/a/b/c/…/…/…/x/y/z”,该函数会将其简化为 “/x/y/z”。

代码的主要思路是使用栈来模拟路径的进入和返回。首先,将路径按照 “/” 进行分割,得到一个字符串数组。然后,遍历数组中的每个元素。

如果当前元素是 “…”,表示需要返回上一级目录,那么就从栈中弹出一个元素。如果当前元素不是 “.” 也不是空字符串,那么将其压入栈中。

遍历完数组后,如果栈中还有元素,表示最终的路径不为空。如果栈顶元素是 “/”,则将其移除。最后,将栈中的元素按照 “/” 进行拼接,得到简化后的路径。

如果最终的路径为空,返回 “/”,否则返回拼接后的路径字符串。

这段代码的时间复杂度为 O(n),其中 n 是路径字符串的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

兔C_Java集:Java 语言简介

文章目录 1. Java简介历史简介问&#xff1a;Oracle 为什么收购 SUN 公司关于三个分支语言特性&#xff1a; 2. JDK 的安装与配置安装的官网链接配置环境变量 3. 第一个Java程序4. 第一个程序解释关于类的定义 5. CLASSPATH命令自动配置CLASSPATH 与 JVM 的关系CLASSPATH 的手动…

OM3 与 OM4:主要区别和实际应用

OM3 和 OM4 都是激光优化的多模光纤&#xff0c;具有 50/125μm 光纤芯&#xff0c;专为满足 ISO 11801 标准而开发。它们在光纤连接器和应用场景上具有相似性&#xff0c;这往往会导致用户之间的混淆。这些光纤主要设计用于数据中心、局域网 &#xff08;LAN&#xff09; 和其…

500以内的不入耳运动耳机推荐,首推五大业内顶级优品

不入耳式运动耳机因其独特的佩戴方式和设计&#xff0c;能够在运动过程中保持对周围环境的警觉&#xff0c;避免因音乐沉浸而忽视潜在的安全隐患&#xff0c;同时它们还能有效减少对耳道的压迫&#xff0c;让运动更加舒适自在&#xff0c;接下来&#xff0c;就让我为大家推荐一…

MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。

本篇文章主要讲解MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。通过本篇文章你可以快速掌握brew安装相对应环境的能力。 作者&#xff1a;任聪聪 日期&#xff1a;2024年4月12日 一、brew介绍及安装说明 官网地址&#xff1a;https://b…

分布式数据库Polardb-X架构及特点

PolarDB-X架构 计算节点&#xff08;Compute Node&#xff0c;CN&#xff09;是系统的入口&#xff0c;采用无状态设计的sql引擎提供分布式路由和计算&#xff0c;包括SQL解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度&#xff0c;负责分布式事务2PC协调…

VLAN Mapping原理描述

基本原理 路由器收到带Tag的数据报文后&#xff0c;根据配置的VLAN Mapping方式&#xff0c;决定替换外层Tag中的VLAN ID或优先级&#xff1b;然后进入MAC地址学习阶段&#xff0c;根据源MAC地址映射后的VLAN ID刷新MAC地址表项&#xff1b;根据目的MAC映射后VLAN ID查找MAC地…

【电控笔记2.3】速度回路+系统延迟

2.3.1速度回路pi控制器设计 pi伯德图近似设计(不考虑延时理想情况下) Tl:负载转矩 PI控制器的转折频率:Ki/Kp

用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本

在实际项目中&#xff0c;从Kafka到HDFS的数据是每天自动生成一个文件&#xff0c;按日期区分。而且Kafka在不断生产数据&#xff0c;因此看看kettle是不是需要时刻运行&#xff1f;能不能按照每日自动生成数据文件&#xff1f; 为了测试实际项目中的海豚定时调度从Kafka到HDF…

Django中的定时任务与后台任务队列的实践【第164篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Web开发中&#xff0c;处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强…

隐私保护?还是安全漏洞?邮箱分身双重身份及创建攻略解析!

很多人只知道微信、QQ等应用分身&#xff0c;对于邮箱分身并不是很了解。邮箱分身和他们的不同点在于我们直接在原有邮箱的基础上创立新的虚拟邮箱地址&#xff0c;并且密码一致&#xff0c;在我们需要运营多个社交媒体账号或者管理多个项目的情况下&#xff0c;邮箱分身是一个…

为什么物联网安全性引发了对身份盗窃的担忧?

物联网是连接互联网的设备和传感器的统称&#xff0c;它代表了一个新的技术时代。这种硬件利用了连接性、硬件、小型化、云计算、数据处理、集成等方面的进步&#xff0c;为消费者和企业带来了好处&#xff0c;同样的物联网方面的威胁也是不断的在增加。 物联网是连接互联网的设…

【面试经典 150 | 链表】分隔链表

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

leetcode代码记录(全排列 II

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2], [1,2,1], [2,1…

C++ | Leetcode C++题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestValidParentheses(string s) {int left 0, right 0, maxlength 0;for (int i 0; i < s.length(); i) {if (s[i] () {left;} else {right;}if (left right) {maxlength max(maxlength, 2 * ri…

基于SSM的购物小程序01

4.1系统架构设计 购物系统设计的系统项目的概述设计分析&#xff0c;主要内容有学习平台的具体分析&#xff0c;进行数据库的是设计&#xff0c;数据采用mysql数据库&#xff0c;并且对于系统的设计采用比较人性化的操作设计&#xff0c;对于系统出现的错误信息可以及时做出处…

GEE APP——土壤水分资源管理器

摘要 由于土壤水分含量与地球气候和天气以及干旱、洪水或山体滑坡等现象有关,因此对许多科学和专业用户来说都非常宝贵。遥感技术为连续测量这一变量提供了独特的可能性。特别是在农业领域,对高空间分辨率绘图的需求非常强烈。然而,目前可操作的土壤水分产品只有中粗空间分…

Udio——革命性的AI音乐生成软件

Udio是一款革命性的AI音乐生成软件&#xff0c;由前谷歌DeepMind的顶尖AI研究人员和工程师共同创立&#xff0c;得到著名风险投资公司a16z的支持。它旨在为音乐爱好者和专业人士提供一个全新的音乐创作和分享平台。用户可以通过文本提示来生成音乐&#xff0c;支持广泛的音乐风…

HashMap的扩容看这一篇足够

在Java中&#xff0c;对于HashMap这样的实现&#xff0c;put方法是用来将一个键值对插入到Map中的核心方法。以下是HashMap类中put方法的大致执行流程&#xff1a; 计算Hash值&#xff1a; 首先&#xff0c;put方法会接收一个键&#xff08;Key&#xff09;和一个值&#xff0…

第四百六十二回

文章目录 1. 概念介绍2. 实现方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"关于MediaQuery的优化"相关的内容&#xff0c;本章回中将介绍readMore这个三方包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的readMore是一个…

大模型的自我监督

大家好啊&#xff0c;我是董董灿。 之前有小伙伴私信我&#xff0c;想了解下大模型比如 chatGPT 是如何进行训练的。 和他们聊了一下&#xff0c;发现有一个点一直困惑着大家&#xff0c;那就是&#xff1a;大模型的训练是无监督学习还是有监督学习&#xff1f;在大模型训练过…