工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/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
#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; }
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(); } } }
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(); } } }
// 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; }
#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; }
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(); } } }
#include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; int main() { int n; while (cin >> n) { string src; vector<string>v; getchar(); for (int i = 0; i < n; ++i) { getline(cin, src); v.push_back(src); } sort(v.begin(), v.end()); for (int i = 0; i < n - 1; ++i) { if (v[i + 1].substr(0, v[i].size()) != v[i]) { cout << "mkdir -p " << v[i] << endl; } else { if (v[i + 1][v[i].size()] != '/') { cout << "mkdir -p " << v[i] << endl; } else continue; } } cout << "mkdir -p " << v[v.size() - 1] << endl; cout << endl; } }
第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; }
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(); } } }
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(); } } }
解题思路:
将输入的字符串存在数组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; }
#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; }
#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; }
// 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; }
//如果一个路径为子路径则不输出,其余皆输出 #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; }