首页 > 试题广场 >

mkdir

[编程题]mkdir
  • 热度指数:2931 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/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”命令。

每组数据之后输出一个空行作为分隔。
示例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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main() 
{
	int n;
	while (cin >> n)
	{
		vector<string> list(n);
		vector<bool> flag(n, true);
		for (int i = 0; i < n; ++i) cin >> list[i];
		sort(list.begin(), list.end());

		for (int i = 0; i < list.size() - 1; ++i)
		{
			// 1、两串相同
			// 2、前串是后串的子串,而且后串后一位是 '/'
			if (list[i] == list[i + 1]) flag[i] = false;
			else if (list[i].size() < list[i + 1].size() && \
				list[i] == list[i + 1].substr(0, list[i].size()) &&	list[i + 1][list[i].size()] == '/')
				flag[i] = false;
		}

		for (int i = 0; i < list.size();++i)
			if (flag[i]) cout << "mkdir -p " << list[i] << endl;
		cout << endl;
	}
	return 0;
}

编辑于 2015-12-21 16:12:54 回复(3)
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			String[] arr = new String[n];
			for (int i = 0; i < arr.length; i ++ ) {
				arr[i] = sc.next();
			}
			Arrays.sort(arr);
			List<String> res = new ArrayList<>();
			for (int i = 1; i < arr.length; i ++ ) {
				if( ! arr[i].startsWith(arr[i - 1] + "/")) res.add(arr[i - 1]);
			}
			res.add(arr[n - 1]);
			for (String s:res) {
				System.out.println("mkdir -p " + s);
			}
			System.out.println();
		}
	}
}

编辑于 2016-10-13 21:00:57 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = Integer.parseInt(sc.nextLine());
            String[] str = new String[n];
            for(int i = 0; i < n; i++){
                str[i] = sc.nextLine();
            }
            // 排序以达到按照字典顺序
            Arrays.sort(str);
            for(int i = 1; i < n; i++){
                // 排完序后最接近的字符串就会相邻
                // 若后者是在前者的路径之后延伸(即为/a/ab和/a/ab/abc的关系)
                // 就将前者变为""以便后续打印时判断,需要注意(/a/ab和/a/abc)这种情况
                if(str[i].contains(str[i-1]) && str[i].charAt(str[i-1].length()) == '/'){
                    str[i-1] = "";
                }
            }
            for(int i = 0; i < n; i++){
                if(!"".equals(str[i])){
                    System.out.println("mkdir -p "+str[i]);
                }
            }
            System.out.println();
        }
    }
}

编辑于 2021-07-26 14:32:47 回复(0)
// write your code here cpp
#include<iostream>
#include<string>
#include<set>
using namespace std;

int main()
{
	int n;
	while (cin >> n)
	{
		set<string> arr;//用来保存输入
		string temp;
		for (int i = 0; i < n; ++i)
		{
			cin >> temp;
			arr.insert(temp);
		}
		for (auto it = arr.begin(); it != --arr.end(); ++it)
		{
			auto j = it++;
			auto pos = (*it).find((*j));
			if ((pos == string::npos) || (pos != 0) || (*it)[(*j).size()]!='\/')//判断是不是后边这个串的子串,并且开始位置相同,满足条件不用输出
				cout << "mkdir -p " << *j << endl;
			it = j;
		}
		cout<<"mkdir -p "<<*(--arr.end())<<endl;//无论何种情况最后一个一定会出输出
		cout << endl;
	}
	return 0;
}

编辑于 2020-03-10 11:50:44 回复(0)
#include<iostream>
#include<string>
#include<vector>
#include<set>
using namespace std;
int main()
{
	int length;
	string s, next, mkdir = "mkdir -p ";
	while (cin >> length)
	{
		set<string> data;
		for (int i = 0; i < length; 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.length())
			{
				res.insert(s);
				s = next;	
			}
			else
			{
				string t;
				for (int i = 0; i < s.length(); i++)
					t += next[i];
				if (t == s && next[s.length()] == '/')
					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;
}

发表于 2017-04-24 20:35:22 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class _t139 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int n=in.nextInt();
			int size=n;
			String sArr[]=new String[size];
			int sLenArr[]=new int[size];
			int k=0;
			while(n--!=0){
				String str=in.next();
				sArr[k]=str;
				sLenArr[k++]=str.length();
			}
			
			String ts = "";
			int tn=0;
			for (int i = size - 1; i > 0; --i)
			{
			    for (int j = 0; j < i; ++j)
			    {
			        if (sLenArr[j + 1] > sLenArr[j])
			        {
			        	ts = sArr[j];
			        	sArr[j] = sArr[j + 1];
			        	sArr[j + 1] = ts;
			        	
			        	tn = sLenArr[j];
			        	sLenArr[j] = sLenArr[j + 1];
			        	sLenArr[j + 1] = tn;
			        }
			    }
			}
			
//			System.out.println(Arrays.toString(sArr));
//			System.out.println(Arrays.toString(sLenArr));
			
			for (int i = 0; i < size; i++) {
				String s1[]=sArr[i].split("/");
				if(sArr[i].equals("#")) continue;
				boolean flag=false;
				for (int j = i+1; j < size; j++) {
					String s=sArr[j];
					if(s.equals("#")) continue;
					String[] split = s.split("/");
					int splitLen=split.length;
					for (int m = 1; m < splitLen; m++) {
						if(!split[m].equals(s1[m])){
							flag=true;//保留
							break;
						}
					}
					
					if(!flag){//合并
						sArr[j]="#";
					}
				}
			}
			
			Arrays.sort(sArr);
			
			for (int i = 0; i < size; i++) {
				if(!sArr[i].equals("#")){
					System.out.println("mkdir -p "+sArr[i]);
				}
			}
			System.out.println();
		}
	}
}
Q:不知道哪里出问题,测试用例第一个 1024 测试用例都不完整的。郁闷~
查看源代码就知道,没有1024个。无语~

发表于 2016-10-15 15:12:34 回复(0)
题目有问题,我拿评论区跑通了的代码来测试,发现测试用例第7组有以下输出:

第228条mkdir -p /usr/share/doc/perl

第229条mkdir -p /usr/share/doc/perl-Error

第230条mkdir -p /usr/share/doc/perl/html/html3/site/lib/Error

很明显,/usr/share/doc/perl明明包含在了/usr/share/doc/perl/html/html3/site/lib/Error里才对,这样的错误有好几处。
#include <iostream>
#include <string>
#include <set>
using namespace std;
bool CuttingDirectory(const string& str, string& answer, bool newstr) {//分割长目录
    answer.clear();
    static int pos = 0;
    if (newstr)
        pos = 0;
    do {
        answer.push_back(str[pos]);
        ++pos;
    } while (pos < str.size() && str[pos] != '/');
    return pos < str.size() ? true : false;
}
int main() {
    int n = 0;
    while (cin >> n) {
        set<string> order;
        string str;
        while (n--) {
            cin >> str;
            if(!str.empty())
                order.insert(str);
        }
    
        set<string>::iterator  it = order.end();
        --it;
        string path;
        while (it != order.end()) { //从后往前遍历set,一定先遍历到长目录,查找有无被包含的短目录删除之,后续不会再遍历到
            bool ret = CuttingDirectory(*it, path, true);
            while (ret) {
                if (path == "/usr/share/doc/perl")
                    int x = 0;
                set<string>::iterator result = order.find(path);        
                if (result != order.end()) {
                    order.erase(result);
                }
                if (ret = CuttingDirectory(*it, str, false))
                    path += str;
            }
            --it;
        } 
        for (auto& x : order) {
            cout << "mkdir -p " << x << endl;
        }   
        cout << endl;
    }
    return 0;
}


发表于 2023-08-09 03:15:48 回复(1)
import java.util.*;

public class Main{
    public  static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
            int n = scan.nextInt();
            String[] path = new String[n];
            for(int i = 0; i < n; i++){
                path[i] = scan.next();
            }
            Arrays.sort(path);
            boolean[] flag = new boolean[n];
            for(int i = 0; i < n-1; i++){
                if(path[i].equals(path[i+1])){
                    flag[i] = true;
                }
                if(path[i].length() < path[i+1].length() && path[i+1].contains(path[i]) && path[i+1].charAt(path[i].length()) == '/'){
                    flag[i] = true;
                }
            }
            
            for(int i = 0; i < n; i++){
                if(!flag[i]){
                    System.out.println("mkdir -p " + path[i]);
                }
            }
            System.out.println();
        }
    }
}

发表于 2023-03-09 21:03:07 回复(0)
这个题的答案有问题吧,
给的期望结果是这样的,但是很明显第三行就包含了第一行啊
发表于 2022-08-07 21:29:46 回复(4)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            String[] arr = new String[n];
            for(int i = 0;i < n;i++){
                arr[i] = sc.next();
            }
            Arrays.sort(arr);
            boolean[] flg = new boolean[n];
            for(int i = 0;i < arr.length - 1;i++){
                if(arr[i].equals(arr[i + 1])){
                    flg[i] = true;
                }else if(arr[i].length() < arr[i+1].length() && arr[i+1].contains(arr[i]) && arr[i+1].charAt(arr[i].length()) == '/'){
                    flg[i] = true;
                }
            }
            
            for(int i = 0;i < n;i++){
                if(!flg[i]){
                  System.out.println("mkdir -p "+arr[i]);
                }
            }
               System.out.println();
        }
    }
}

发表于 2022-05-29 19:32:38 回复(0)

这几个是答案预期输出的,是不是有问题啊
发表于 2022-04-03 23:58:55 回复(2)

解题思路:
将输入的字符串存在数组vecter中,用sort对数组排序,即实现字典排序。

然后,再判断前一个数据时后一个数据的子串且后一个数据的下一位是'/',则删除前一个数据,如此判断数组的每个数据。

最后,在没有重复的vector中,在每个字符串前面加“mkdir -p ”串输出即可。这里注意-p左右必须都有空格。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
//查看s1是不是s2的子串
bool Is_substr(string s1,string s2)
{
    if(s1[1] == s2[1])
    {
        s2=s2.substr(0,s1.size());
        if(s1 == s2)
            return true;
    }
    return false;
}
void mkdir(vector <string> v)
{
    string mk="mkdir -p ";
    int i=0;
    while(i < v.size()-1)
    {
        //前一个是后一个的子串,并且后一个子串的下一个位置是/
        if(Is_substr(v[i],v[i+1]) && v[i+1][v[i].size()]=='/')
            v.erase(v.begin()+i);
        else
            i++;
    }
    for(auto & e:v)
    {
        cout << mk << e << endl;
    }
}

int main()
{
    int n;
    while(cin>>n)
    {
        vector <string> v;
        for(int i=0; i<n; ++i)
        {
            string s1;
            cin>>s1;
            v.push_back(s1);
        }
        sort(v.begin(),v.end());
        mkdir(v);
        cout<<endl;
    }
    return 0;
}
发表于 2021-06-08 20:41:06 回复(0)
这就很尴尬了,真不知道哪里出问题了
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace  std;
//mkdir
bool is_son(string str1,string str2){
	for(int i=0;i<str2.size();i++){
		if(str1[i]!=str2[i])
			return false;
	}
	if(str1[str2.size()]=='/')
		return true;
	else return false;
}
int main(){
	int n;
	while(cin>>n){
		vector<string> strs(n);
		int k[1024]={0};
		int j=0;
		for(int i=0;i<n;i++)
			cin>>strs[i];
		sort(strs.begin(),strs.end());
		for(int i=0;i<strs.size()-1;i++){
			if(is_son(strs[i+1],strs[i])){
				k[i]=0;
				k[i+1]=1;
			}	
			else{
				k[i]=1;
				k[i+1]=1;
			}
		}
		for(int i=0;i<strs.size();i++){
			 if (k[i]) 
			 	cout<<"mkdir -p "<<strs[i]<< endl;
		}
		cout<<endl;
	}
	return 0;
}


发表于 2020-08-10 19:54:36 回复(0)
这是啥子情况
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    int put;
    while(cin >> put)
    {
        vector<string> v;
        string s = "mkdir -p ";
        for(int i = 0; i < put; ++i)
        {
            string s1;
            cin >> s1;
            v.push_back(s1);
        }
        int flag = 0;
        for(int i = 0; i < v.size() - 1; ++i)
        {
            for(int j = 0; j < v.size() - i - 1; ++j)
            {
                if(v[j].size() > v[j + 1].size())
                {
                    swap(v[j],v[j+1]);
                    flag = 1;
                }
            }
        }
        if(flag == 0)
        {
            cout << (s+v[v.size()-1]) << endl;
            printf("\n");
        }
        else
        {
            for(int i = 0; i < v.size(); ++i)
                cout << (s + v[i]) << endl;
        }
    }
    return 0;
}

发表于 2020-07-14 19:42:42 回复(1)
// write your code here cpp
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

class Solution{
public:
    vector<string> fun(vector<string>& data){
        vector<string> res;
        sort(data.begin(), data.end());
        for(int i = 0, size = data.size(); i < size - 1; ++i){
            if ((data[i + 1] + '/').find(data[i] + '/') == string::npos) {
                res.push_back(data[i]);
            }
        }
        res.push_back(data[data.size() - 1]);
        return res;
    }
};

int main(){
    int n;
    Solution s;
    while(cin >> n){
        vector<string> data(n);
        for(auto& s : data){
            cin >> s;
        }
        for(auto& s : s.fun(data)){
            cout <<  "mkdir -p " << s << endl;
        }
        cout << endl;
    }
    return 0;
}


编辑于 2020-04-06 12:32:50 回复(0)
//如果一个路径为子路径则不输出,其余皆输出
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    int n=0;
    while(cin>>n)
    {
        vector<string>v1(n);
        vector<int>v2(n,1);
        for(int i=0;i<n;i++)
            cin>>v1[i];
        sort(v1.begin(),v1.end());
        for(int i=0;i<v1.size()-1;i++)
        {
            if(v1[i+1].find(v1[i])==v1[i+1].npos) continue;
            else{//有可能为崽崽
                if(v1[i]==v1[i+1]||(v1[i].size()<v1[i+1].size()&&v1[i]==v1[i+1].substr(0,v1[i].size())&&v1[i+1][v1[i].size()]=='/'))
                    v2[i]=0;
            }
        }
        for(int i=0;i<v1.size();i++)
           if(v2[i])cout<<"mkdir -p "<<v1[i]<<endl;
        cout<<endl;
    }
    return 0;
}

编辑于 2020-03-09 11:22:49 回复(0)
链接:https://www.nowcoder.com/questionTerminal/433c0c6a1e604a4795291d9cd7a60c7a
来源:牛客网

您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.93%

用例:
Bc1:109,c2:1093
Bc1:109,c2:1097
/usr/local/share/bin

对应输出应该为:

mkdir -p /ab/b

你的输出为:

mkdir -p /ab/bc/c


这怕是不对吧
求指点
发表于 2019-07-23 17:07:24 回复(1)

问题信息

难度:
17条回答 10283浏览

热门推荐

通过挑战的用户

查看代码