笔试题目
题目的场景大概是:小明想要请你帮他实现一个功能:当他输入一个String类型用户名时。用户名有一定要求:
①用户名长度必须在6至12之间,否则返回"illegal length"
②用户名里面不能出现非英文字母,否则返回"illegal format"
③如果已经注册过,就返回"Has been registed",如果都没上述情况则返回"Success"。
输入格式:第一行代表n个用户名,下面每一行都是用户名
很快啊,一下写出答案
代码
import java.util.*;
public class Main{
private static final Set<String> set = new HashSet();
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] strs = new String[n];
for(int i = 0 ; i < n ; i++){
strs[i] = sc.next();
}
List<String> list = judge(strs);
for(String s : list){
System.out.println(s);
}
}
private static List<String> judge(String[] strs){
List<String> result = new ArrayList();
for(int i = 0 ; i < strs.length ; i++){
result.add(function(strs[i));
}
return result;
}
private static String function(String s){
int n = s.length();
if(n < 6 || n > 12)return "illegal length";
if(!s.match("[a-zA-Z]+"){
return "illegal format";
}
if(set.contains(s)){
return "has been registed";
}
set.add(s);
return "Success";
}
}
然后
这么迅速地解答出来,让我有点不敢相信自己的眼睛。果不其然,只过了83.33%。想了一会,没想出来为什么。当时并没有钻牛角尖,就跳过了。试后,才发现是因为用户名之间可能会有空格!。
Scanner的坑
查阅文档发现:当使用scanner.nextInt() (或者next() , nextDouble(), nextFloat())方法时,这些方法它的识别终止符是空格,且会留下代表结束的换行符。而Scanner.nextLine()方法的识别终止符是换行符。
所以,总结: 当一行代表一个数据的时候,可以尽量使用sc.nextLine()方法。而一行中有多个数据的时候,数据为Integer类型采用sc.nextInt() , 数据为String类型采用sc.next()。且切记:在使用sc.next()或者sc.nextInt()等方法后,不能使用sc.nextLine(),否则后者因直接读到前者留下的换行符而读不到任何数据。