精简Linux文件路径

精简Linux的文件路径:

  1. ..回退的功能
  2. .留在当前目录
  3. //只保留一个/
  4. abc/..要返回.
  5. 报错
  6. 删除最后一个/

主要思路: 用栈记录路径的起始位置,讨论/后的不同情况即可:

#include <iostream>
#include <map>
#include <algorithm>
#include <limits.h>
#include <assert.h>
#include <stack>
using namespace std;
int selectK(int num[], int k, int l, int r) {

  assert(k <= (r - l + 1) && k >= 1);
  int mid = (l + r) / 2, i = l, j = r;
  while (i <= j) {
    while (num[i] < num[mid]) {
      ++i;
    }
    while (num[j] > num[mid]) {
      --j;
    }
    if (i <= j) {
      swap(num[i],num[j]);
      ++i,--j;
    }
  }
  if (k == i - l)
    return num[i - 1];
  else if (k < i - l)
    return selectK(num, k, l, i -1);
  else if (k == j + 1 - l)
    return num[j + 1];
  else
    return selectK(num, k - (j - l + 2), j + 2, r);
}
void pathcompress(char* str) {
  int i = 0, j = 0;

  char prev = ‘\0‘;
  stack<int> offset;
  offset.push(0);
  while(str[i]) {
    if (prev == ‘/‘) {
        if (str[i] == ‘.‘ && (str[i + 1] == ‘/‘ || str[i + 1] == ‘\0‘)) {
          prev = str[i + 1], i += 1;
        }
        else if (str[i] == ‘.‘ && str[i + 1] == ‘.‘ && (str[i + 2] == ‘/‘ || str[i + 2] == ‘\0‘)) {
          i += 2;
          if (offset.empty()) {
            cout << "error" << endl;
            return;
          }
          j = offset.top();
          offset.pop();
          if (offset.empty() && str[0] == ‘/‘) {
            cout << "error" << endl;
            return;
          }
        }
        else if (str[i] == ‘/‘) {
          prev = str[i++];
        }
        else {
          offset.push(j);
          prev = str[i];
          str[j++] = str[i++];
        }
    }
    else {
      prev = str[i];
      str[j++] = str[i++];
    }
  }
  if (j >=3 && str[j - 1] == ‘/‘ && str[j-2] == ‘/‘)
    str[j-2] = ‘\0‘;
  else if (j >= 2 && str[j - 1] == ‘/‘)
    str[j-1] = ‘\0‘;
  else
    str[j] = ‘\0‘;
  if (str[0] == ‘\0‘){
    str[0] = ‘.‘;
    str[1] = ‘\0‘;
  }

}

int main()
{
  int num[] = {3,2,1,4,5};
  int res1 = selectK(num, 1, 0, 4);
  int res2 = selectK(num, 2, 0, 4);
  int res3 = selectK(num, 3, 0, 4);
  int res4 = selectK(num, 4, 0, 4);
  int res5 = selectK(num, 5, 0, 4);
 // int res6 = selectK(num, 6, 0, 4);

  //char str[] = "////";
  char str[] = "/.abc/xxx./abc/bacd/.././bcd/fsgs/../../../x/y/z/../../../..";
  pathcompress(str);
  printf("%s\n",str);

  return 0;
}

精简Linux文件路径,码迷,mamicode.com

时间: 2024-10-16 12:31:46

精简Linux文件路径的相关文章

在数据库中,文件路径应该存储斜杠/,还是反斜杠\呢?

背景 在做Web项目中,需要上传头像,数据库表中自然存储其相对路径,然后就想应该存储斜杠还是反斜杠呢?(当然好像也不需要特别关心,因为在程序中把路径读取到直接上传保存就知道是斜杠还是反斜杠了,这里仅简单地想一下) 认识 1.首先网址是斜杠,如https://www.baidu.com/ 2.Linux文件路径是斜杠 3.Windows文件浏览器用的是反斜杠,而斜杠是用在Dos命令中.如图,当我在命令行中输入cd D:/Progra,同时按下Tab键的时候,发现没有任何反应:而当我输入cd D:\

截取linux文件存储路径方法

1.截取linux文件存储路径方法 package com.tydic.eshop.action.freemarker; public class dddd { public static void main(String[] args) { String strParentUrl = "/home/tomcat7/ecp/t8086/webapps/ecp/FreeMarker/1463766670142/error/html/index.html"; String[] s = st

java处理文件路径windows与linux兼容问题

window和linux分隔符其实就是\和/的区别,其实让文件路径根据服务器的系统的不同而不同就可以了,而java已经给我们提供方法了 System.getProperty("file.separator")能根据系统的不同获取文件路径的分隔符

Linux下SSH的Log文件路径

Redhat or Fedora Core: /var/log/secure # Mandrake, FreeBSD or OpenBSD: /var/log/auth.log # SuSE: /var/log/messages # Mac OS X (v10.4 or greater): /private/var/log/asl.log # Mac OS X (v10.3 or earlier): /private/var/log/system.log # Debian: /var/log/a

Linux库文件路径的添加

linux操作系统中,linux库文件路径还是比较常用的,于是我研究了一下linux库文件路径,在这里拿出来和大家分享一下,希望对大家有用. 库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用.对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中.设置库文件的搜索路径有下列两种方式

linux whereis-查找二进制程序、代码等相关文件路径

推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 whereis命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径. whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找

同一台 Centos (Linux)服务器设置多个sftp 账号,并限制用户只能访问指定文件路径

备注:本资源部份来源网络,本文章只是作为优化,整理,方便自己与需要的朋友查看. #=================================================================== 0. 我们需要创建一个用户组,专门用于sftp用户,每台Linux服务器建立一次sftp 用户组即可. groupadd sftpusers //这里表示创建 sftpusers组 #=================/// 第一个SFTP账号创建 //==============

jeesite ckfinder mac/linux 文件上传路径设置

背景: 如果你使用的是Mac 或者 Ubuntu 这种 Unix系统的话,你一定知道Unix系统的文件路径分隔符是 / 而Windows系统文件分隔符是 \ 当你设置了jeesite.properties 中的 userfiles.basedir= D\:\\workspace\\jeesite 如果不设置,上传的路径会是:dir = ServletContextFactory.getServletContext().getRealPath("/"); 在如果你使用的是Windows操

Linux读取文件路径问题

问题是这样的: 首先终端上有当前路径显示,我有个可执行程序代码是这样的: FILE fp  = fopen(filename, "rb"); if(fp == NULL)     printf("cannot open\n"); 编译出来的可执行程序(elf格式)比如在/home/username下面.filename中的这个文件也是在username下. 我偶然这样运行: 终端当前路径是:/home ./username/my_elf 那么就会导致文件无法打开,其