工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/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;
}