【C++】mkdir

该博客主要介绍了如何在C++中处理路径问题,特别是判断一个路径是否为另一个路径的子路径。内容涉及字典序排序以及排除特定输出条件的实现代码。

题目描述:

工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/usr/local/bin”,就需要此次创建“/usr”、“/usr/local”以及“/usr/local/bin”。好在,Linux下mkdir提供了强大的“-p”选项,只要一条命令“mkdir -p /usr/local/bin”就能自动创建需要的上级目录。
现在给你一些需要创建的文件夹目录,请你帮忙生成相应的“mkdir -p”命令。

输入描述:

输入包含多组数据。
每组数据第一行为一个正整数n(1≤n≤1024)。
紧接着n行,每行包含一个待创建的目录名,目录名仅由数字和字母组成,长度不超过200个字符。

输出描述:

对应每一组数据,输出相应的、按照字典顺序排序的“mkdir -p”命令。
每组数据之后输出一个空行作为分隔。

示例输入:

3
/a
/a/b
/a/b/c
3
/usr/local/bin
/usr/bin
/usr/local/share/bin

输出:

mkdir -p /a/b/c

mkdir -p /usr/bin
mkdir -p /usr/local/bin
mkdir -p /usr/local/share/bin

由题目我们可以了解到:

  • 输出的文件列表需要按照字典序排好序
  • 对于输入的路径有三种情况不用输出:
  1. 当前路径与前一个接收到的路径相同,则不用再输出一次
  2. 若前一个接收到的路径是当前路径的子串,则不用再次输出

所以现在只要实现了判断前一个路径是否是当前路径的子串即可解决问题。具体代码如下:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        vector<string> dirstr(n);//使用vector<string>类型来接收路径
        vector<bool> flag(n,true);//设置标签,默认为true
        for(int i=0;i<n;++i)
        {
            cin>>dirstr[i];//接收所有输入路径
        }
        sort(dirstr.begin(),dirstr.end());//按照字典序排序
        for(int i=0;i<dirstr.size()-1;++i)
        {
            if(dirstr[i]==dirstr[i+1])
                flag[i]=false;//当前路径与后一个路径相同则只需输出一次
            //判断是否为子串,以下三个条件同时满足:
            //1.当前路径长度小于后一个路径长度
            //2.下一个路径字符串按照当前字符串路径截断返回的字符串与当前路径字符串相同
            //3.下一个路径字符串与当前字符串相同的内容后一个字符为'/'
            else if((dirstr[i].size()<dirstr[i+1].size())
                    &&(dirstr[i]==dirstr[i+1].substr(0,dirstr[i].size()))
                    &&(dirstr[i+1][dirstr[i].size()]=='/'))
                    flag[i]=false;
        }
        for(int i=0;i<dirstr.size();++i)
        {
            if(flag[i])
                cout<<"mkdir -p "<<dirstr[i]<<endl;
        }
        cout<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值