算法提高 新建Microsoft Word文档  


时间限制:1.0s   内存限制:256.0MB



    


问题描述


如果在控制台上(Console)分别输入“ hello 2 ”(注意前、后和中间都有空格),第1个例子会输出“ hello 2 ”(注意前、后和中间都有空格),第2个例子会输出“hello”。

L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫《新建Microsoft Word文档》吗?”,L大喜,一拍桌子,说:“好,就叫这个名字了。” 
  
   仔细观察,当你新建一个word文档时,会得到一个名为“新建 Microsoft Word 文档.doc”的文件,再新建一个,则名为“新建 Microsoft Word 文档(2).doc”,再新建,便是“新建 Microsoft Word 文档(3).doc”。不断新建,编号不断递增。倘若你现在新建了三个文档,然后删除了“新建 Microsoft Word 文档(2).doc”,再新建就又会得到一个“新建 Microsoft Word 文档(2).doc”。 
  

   严格说,Windows在每次新建文档时,都会选取一个与已有文件编号不重复的最小正整数作为新文档的编号。 
  

   请编程模拟以上过程,支持以下两种操作 
  
   New:新建一个word文档,反馈新建的文档的编号 
  
   Delete id:删除一个编号为id的word文档,反馈删除是否成功 
  
   初始时一个文件都没有,“新建 Microsoft Word 文档.doc”的编号算作1。 
  
 

   输入格式 
 
 
 

     第一行一个正整数n表示操作次数,接下来n行,每行表示一个操作。若该行为”New”,则表示新建,为”Delete id”则表示要删除编号为id的文档,其中id为一个正整数。操作按输入顺序依次进行。 
 
 
 

   输出格式 
 
 
 

     对于输入的每一行,输出其反馈结果。对于新建操作,输出新建的文档的编号;对于删除操作,反馈删除是否成功:如果删除的文件存在,则删除成功,输出”Successful”,否则输出”Failed”。 
 
 
 

   样例输入 
 
 
 

   12 
  
 New 
  
 New 
  
 New 
  
 Delete 2 
  
 New 
  
 Delete 4 
  
 Delete 3 
  
 Delete 1 
  
 New 
  
 New 
  
 New 
  
 Delete 4 
  
 

   样例输出 
 
 
 

   1 
  
 2 
  
 3 
  
 Successful 
  
 2 
  
 Failed 
  
 Successful 
  
 Successful 
  
 1 
  
 3 
  
 4 
  
 Successful 
  
 

   数据规模和约定 
 
 
 

     操作次数(即输入的行数)不超过1481 
  
   删除编号的数值不超过2012 
  

写这篇文章,还是为了自己能理解scanner.next()和scanner.nextline()的区别。


在jdk6中文版帮助文档中找到以下资料:

nextLine
 
public String nextLine()
 
因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的行。 
 
  
 
返回: 
    
   
     跳过的行 
    
    
    抛出: 
    
    
    NoSuchElementException - 如果未找到这样的行 
    
    
    IllegalStateException - 如果此扫描器已关闭 
   


next
 
public String next()
 
   查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息。即使以前调用 
   hasNext() 返回了 
  true,在等待要扫描的输入时此方法也可能阻塞。 
   
 
指定者: 
    
   
     接口 
    Iterator<String> 中的 
    next 
    
 
返回: 
    
   
     下一个标记 
    
    
    抛出: 
    
    
    NoSuchElementException - 如果没有更多标记可用 
    
    
    IllegalStateException - 如果此扫描器已关闭 
    
    
    另请参见: 
    
Iterator



转载于:
简单的说。
nexitline()方法:结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
next()方法:一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。

例子:
1、
Scanner scanner = new Scanner(System.in);
 String string = scanner.nextLine();
 System.out.println(string);
2、
Scanner scanner = new Scanner(System.in);
 String string2 = scanner.next();
 System.out.println(string2);

因为第2个例子next()方法会认为空格键是结束符!!!




思路:

先创建一个长度为1500的数组arr(因为题目提到操作次数不超过1481,创建数组时,系统会初始化为0),因为New的第一个字母为‘N’,Delete的第一个字母为‘D’,然后使用字符串的函数charAt()取得字符串的第一个字符判断,如果数组值为0则还没有被创建,如果数组值为1则认为以创建。



代码如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		int[] arr = new int[1500];
		int n = scanner.nextInt();
		for(int i=0;i<n;i++){
			String string = scanner.next();
			if(string.charAt(0)=='N'){//New
				for(int j=0;j<n;j++){
					if(arr[j]==0){
						arr[j]=1;
						System.out.println(j+1);
						break;
					}
				}
			}else{//Delete
				int a = scanner.nextInt();
				if(arr[a-1]==1){
					arr[a-1]=0;
					System.out.println("Successful");
				}else if(arr[a-1]==0){
					System.out.println("Failed");
				}
			}
		}
	}
}