• Java实现 洛谷 P1738 洛谷的文件夹


    题目描述
    kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现。

    洛谷的网页端,有很多文件夹,文件夹还套着文件夹。

    例如:/luogu/application/controller表示根目录下有一个名称为luogu的文件夹,这个文件夹下有一个名称application的文件夹,其中还有名为controller的文件夹。

    每个路径的第1个字符总是’/’,且没有两个连续的’/’,最后的字符不是’/’。所有名称仅包含数字和小写字母。

    目前根目录是空的。kkksc03想好了很多应该有的文件夹路径名。问题是,需要是使这些文件夹都存在,需要新建几个文件夹呢?

    输入输出格式
    输入格式:
    输入文件第1行为一个正整数N。

    接下来N行,每行为一个描述路径的字符串,长度均不超过100。

    输出格式:
    输出应包含N行,每行1个正整数,第i行输出若要使第1个路径到第i个路径存在,最少需要新建多少个文件夹。

    输入样例#1:
    2
    /luogu/application/controller
    /luogu/application/view
    输出样例#1:
    3
    4
    输入样例#2:
    3
    /chicken
    /chicken/egg
    /chicken
    输出样例#2:
    1
    2
    2
    输入样例#3:
    4
    /a
    /a/b
    /a/c
    /b/b
    输出样例#3:
    1
    2
    3
    5

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    
    public class 洛谷的文件夹 {
    	public static void main(String[] args) {
    		int count=0;						//计算新建文件夹次数
    		Scanner sc =new Scanner(System.in);
    		ArrayList<String>  list = new ArrayList<String>();
    		ArrayList<String> list1 = new ArrayList<String>();
    		int n = sc.nextInt();
    		for (int i = 0; i < n; i++) {
    			String s = sc.next();
    			list.add(s);					//把每一个路径都保存为String放入list里面		
    		}
    		Collections.sort(list);				//把这些路径按照字典序排序
    			//排完序就会把相同路径或者相似路径的放在一起  可以比对这一个和下一个的不同来计算
    			//不用再去记录以前建过的文件夹
    		String sss = list.get(0);
    		String [] num3 = sss.substring(1).split("/");
    		for (int i = 0; i < num3.length; i++) {
    			list1.add(num3[i]);
    			count++;
    		}				//先把第一个保存下来
    		for (int i = 0; i <list.size()-1; i++) {
    			System.out.println(count);
    			String s = list.get(i);
    			String ss = list.get(i+1);
    			String  [] num1 = s.substring(1).split("/"); //这里是为了拆分使用,来匹配相对位置的文件夹是不是被建过
    			String [] num2 = ss.substring(1).split("/");
    			int min = Math.min(num1.length, num2.length);//保存最小长度的
    			int temp=-1;								//这里是用第一个当基础来与第二个的比较
    			if(num1.length<num2.length){ 				//如果第二个长度大,就先保存一下
    				temp=num1.length;
    			}
    			for (int j = 0; j < min; j++) {
    				if (num1[j].equals(num2[j])) {			//第一个相同
    					if (!list1.contains(num1[j])) {		//   list1 这里是list1  看看是否有这个文件夹
    						count++;						//这里主要是  看看这两个路径里有几个相同的  防止加上相同的文件夹
    						list1.add(num1[j]);				//没有就加上这个文件夹   count记录次数
    					}
    				}
    				else {									//如果这两个不相等
    					temp=j;								//就保存下标  结束掉
    					break;
    				}
    			}
    			if (temp!=-1) {								//如果有不相同的 或者第二个数组长的
    				list1 = new ArrayList<String>(); 		//list清空  重新录入
    			for (int j = 0; j < num2.length; j++) {  //前面第一个已经录好了  这里录入第二个
    				list1.add(num2[j]);						
    				if(j>=temp){						//当录入到下标的地方,就开始添加次数
    					count++;
    				}
    			}
    			}
    			
    			
    		}
    		System.out.println(count);
    	}
    }
    
    
  • 相关阅读:
    .Net高并发解决思路 以及乐观锁 悲观锁等
    HTTP和HTTPS TCP/IP的UDP和TCP Socket和WebSocket RabbitMq和队列 Redis和Memcached
    C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==
    C# 托管与非托管类型 堆和栈 值类型与引用类型 装箱与拆箱
    C# 递归、冒泡算法 委托与事件 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引底层 表达式树
    C# 爬取数据
    C# 常用设计模式 并发编程(异步 多线程) 锁与死锁 集合数组List
    C# NPOI Excel多级表头导出多个表
    windows Server 2016安装Sqlserver远程连接的坑
    hdfs之NameNode故障处理的两种方式
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078224.html
Copyright © 2020-2023  润新知