2022/3/25 阿里笔试ACM模式下Scanner的坑

笔试题目

题目的场景大概是:小明想要请你帮他实现一个功能:当他输入一个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(),否则后者因直接读到前者留下的换行符而读不到任何数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值