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

leetcode刷题日记——简化路径

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • "…“在这个问题中是一个合法路径名字,”…"表示上一级目录,路径只能存在单’/’
  • 可以先定义一个 strlen(path)+1 长度的stack,用于存储答案
  • 当遇见 ’ / ’ 时,如果栈顶不是 ’ / ',则压入栈顶
  • 当遇见连续 ’ … ’ 的最后一个 ’ . ’ 时,如果下一个字符是 ’ / ',或当前字符是最后一个字符
    • 判断栈中有多少个点
      • 数量大于1,则是路径,压入字符
      • 数量等于1,且前一个字符是 ’ / ',则表示返回上级目录,一直退栈到前一个 ’ / '处
      • 数量等于1,且前一个字符步数 ’ / ’ ,则说明 ‘ . ’ 是路径字符
      • 数量小于1,若 ’ . ’ 前是 ’ / ’ 则表示当前目录本身,直接判断下一个
      • 数量小于1,若 ’ . ’ 前不是 ’ / ’ 则作为路径纳入
  • 运行如下:
    在这里插入图片描述
char* simplifyPath(char* path) {int len=strlen(path);int top=0;char* stack=(char*)malloc(sizeof(char)*(len+1));stack[0]=path[0];for(int i=1;i<len;i++){if(path[i]=='/'){if(stack[top]=='/' || i==len-1) continue;}if(path[i]=='.' && (path[i+1]=='/' || i==len-1)){int count=0,index=top;while(stack[index]=='.'){index--;count++;}if(count<1){if(stack[top]!='/'){stack[++top]=path[i];}continue;}if(count>1){stack[++top]=path[i];continue;} if(stack[index--]=='/'){if(index>0){while(stack[index]!='/') index--;top=index;}else{top=0;}}else{stack[++top]=path[i];}}else{stack[++top]=path[i];}}if(stack[top]=='/' && top!=0) top--;stack[++top]='\0';return stack;
}

[ 官方题解 ]:

  • 方法一:栈,将给定的字符串 path 根据 / 分割成一个由若干字符串组成的列表(空字符串,一个点,两个点,只包含英文字母、数字或_的目录名),然后将字符串当作基本元素,遇见目录名则插入栈中,遇见两个点,则弹出栈顶目录,然后再通过 ’ / ’ 来拼接栈中元素得到简化后的路径
char ** split(const char * s, char delim, int * returnSize) {int n = strlen(s);char ** ans = (char **)malloc(sizeof(char *) * n);int pos = 0;int curr = 0;int len = 0;while (pos < n) {while (pos < n && s[pos] == delim) {++pos;}curr = pos;while (pos < n && s[pos] != delim) {++pos;}if (curr < n) {ans[len] = (char *)malloc(sizeof(char) * (pos - curr + 1)); strncpy(ans[len], s + curr, pos - curr);ans[len][pos - curr] = '\0';++len;}}*returnSize = len;return ans;
}char * simplifyPath(char * path){int namesSize = 0;int n = strlen(path);char ** names = split(path, '/', &namesSize);char ** stack = (char **)malloc(sizeof(char *) * namesSize);int stackSize = 0;for (int i = 0; i < namesSize; ++i) {if (!strcmp(names[i], "..")) {if (stackSize > 0) {--stackSize;} } else if (strcmp(names[i], ".")){stack[stackSize] = names[i];++stackSize;} }char * ans = (char *)malloc(sizeof(char) * (n + 1));int curr = 0;if (stackSize == 0) {ans[curr] = '/';++curr;} else {for (int i = 0; i < stackSize; ++i) {ans[curr] = '/';++curr;strcpy(ans + curr, stack[i]);curr += strlen(stack[i]);}}ans[curr] = '\0';for (int i = 0; i < namesSize; ++i) {free(names[i]);}free(names);free(stack);return ans;
}
http://www.xdnf.cn/news/2088.html

相关文章:

  • AI与思维模型【79】——煤气灯效应
  • 深入解析Mlivus Cloud核心架构:rootcoord组件的最佳实践与调优指南
  • 【金仓数据库征文】交通行业的国产化数据库替换之金仓数据库KingbaseES应用实践
  • 【风控】稳定性指标PSI
  • 基于STM32、HAL库的MAX31865模数转换器ADC驱动程序设计
  • 消息队列mq在Mlivus Cloud向量数据库中的关键配置与最佳实践
  • C++智能指针概念理解的面试题
  • window.location.href的用法
  • 基于 Netmiko 的网络设备自动化操作
  • 《逐梦九天:中国航天编年史》
  • QT文本框(QTextEdit)设置内容只可复制粘贴
  • C++:继承机制详解
  • Cursor 配置 MCP Tool
  • 写在后面的话
  • yolo常用操作(长话短说)热力图,特征图,结构图,训练,测试,预测
  • 打开Qt应用程序以控制台
  • Linux基础篇、第四章_02磁盘及分区管理fdisk 和 gdisk
  • 厚铜PCB打样全流程解析:从文件审核到可靠性测试的关键步骤
  • Python的库
  • Hbase集群管理与实践
  • C语言——字串处理
  • 什么是快应用
  • STM32 I2C总线通信协议
  • 遥感金融风险监管:技术革新与实践探索
  • Java—— 常见API介绍 第五期
  • cursor 提示词和规则
  • 基于SpringBoot+Vue实现停车场管理系统
  • sync.Cond条件变量:使用场景与范例
  • Centos 7 ssh连接速度慢(耗时秒+)
  • LWIP中两种重要的数据结构pbuf和pcb详细介绍