[C++] 835 -- mkdir


例题描述

工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/usr/local/bin”,就需要此次创建“/usr”“/usr/local”以及“/usr/local/bin”
好在,Linuxmkdir提供了强大的“-p”选项,只要一条命令“mkdir -p /usr/local/bin”就能自动创建需要的上级目录。

现在给你一些需要创建的文件夹目录,请你帮忙生成相应的“mkdir -p”命令。

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

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

示例1:

  • 输入:

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>
#include <vector>

using namespace std;
 
int main(){
    int num;
    while(cin >> num){
        vector<string> vs(num);
        vector<bool> flag(num,true);
        
        for(int i = 0;i < num;++i)    cin >> vs[i];
        
        sort(vs.begin(), vs.end());    //字典序排布
        
        for(int i = 0;i < vs.size() - 1;++i){
			//1、两串相同
            if(vs[i] == vs[i+1])    flag[i] = false;
            
			// 2、前串是后串的子串,而且后串后一位是 '/'
            else if(
                vs[i].size() < vs[i+1].size()\
               && vs[i] == vs[i+1].substr(0,vs[i].size())\
               && vs[i+1][vs[i].size()] == '/'
              ){
                flag[i] = false;
            }
        }
        for(int i = 0;i < vs.size();++i){
            if(flag[i])
                cout << "mkdir -p " << vs[i] << endl;
        }          
        cout << endl;
    }
    return 0;
}

代码实现二

#include<iostream>
#include<string>
#include<vector>
#include<set>

using namespace std;

int main(){
    int num;
    string s, next, mkdir = "mkdir -p ";
    while (cin >> num){
        set<string> data;
        for (int i = 0; i < num; i++){
            cin >> s;
            data.insert(s);
        }
        //for (set<string>::iterator it = data.begin(); it != data.end(); it++)
        //    cout << *it << endl;
        set<string>::iterator it = data.begin();
        s = *it;
        set<string> res;
        for (it++; it != data.end(); it++){
            next = *it;
            if (next.length() < s.size()){
                res.insert(s);
                s = next;  
            }
            else{
                string t;
                for (int i = 0; i < s.size(); i++)
                    t += next[i];
                if (t == s && next[s.size()] == '/')
                    s = next;
                else{
                    res.insert(s);
                    s = next;
                }
            }
        }
        res.insert(s);
        for (set<string>::iterator it = res.begin(); it != res.end(); it++)
            cout << mkdir << *it << endl;
        cout << endl;
    }
    return 0;
}

链接:https://www.nowcoder.com/questionTerminal/433c0c6a1e604a4795291d9cd7a60c7a

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

giturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值