题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
- 本题三个条件全部满足OK,否则NG-总体思路
- 下面是满足条件的解决
- 条件1,超过8,满足条件大于8
- 条件2,类型判断,条件拆分统计,flag计数法
-
Pattern.compile("[A-Z]");Pattern使用compile,将条件编译为正则表达式,将被Matcher调用Matcher,find 方法扫描输入序列以查找与该模式匹配的下一个子序列。子序列满足要求即可以
这个类有三个常用方法,lookingAt从指定位置之开始匹配,matches整体匹配,find子匹配
空格和换行符号用hasnext过滤掉, 读取内容 hasTokenInBuffer判断标记是否存在
hasNextLine()报错下面是错误情况 ,读取结果是否空判断,二者判断情况不同
请检查是否存在数组越界等非法访问情况
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at Main.main(Main.java:11)
-
条件3,重复判断,采用子串截取判断法,
pwd.substring(i).contains(pwd.substring(i - 3, i))
2个重复可以,3个以及以上的不能出现重复,3是检查度 一个争议的输出是 ABABA123,个人认为应该出现OK,因为这个出现ABA的情况是重复了A第三位,如果你认为是NG,那换言之你不允许2长度重复,在AB重复相邻
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){//hasTokenInBuffer()
String pwd = scanner.next();
if (pwd.length()>8 && containsCheck(pwd) && subCheck(pwd)){
//超过8位
System.out.println("OK");
//满足要求
}else {
System.out.println("NG");
//下一行字符,本行不满足,判定完成
}
}//while
scanner.close();
}//main
/**
* 包含内容检查,关键是类型判断
*
* @return boolean-true,满足要求,false不满足
*/
private static boolean containsCheck(String pwd){
int flag = 0;
//大写,小写,数字,其他,四种类型,至少三种,逐一字符判断或者是正则
Pattern A = Pattern.compile("[A-Z]");
Pattern a = Pattern.compile("[a-z]");
Pattern num = Pattern.compile("[0-9]");
Pattern other = Pattern.compile("[\\W]");
if (A.matcher(pwd).find()){
flag ++;
}
if (a.matcher(pwd).find()){
flag ++;
}
if (num.matcher(pwd).find()){
flag ++;
}
if (other.matcher(pwd).find()){
flag ++;
}
if (flag >=3)
return true;//符合
else
return false;
}
/**
* 子串重复检查
*
* @return boolean
*/
private static boolean subCheck(String pwd){
int right = 3;
for (int i = right; i <= pwd.length(); i++) {
boolean contains = pwd.substring(i).contains(pwd.substring(i - 3, i));
if (contains){
return false;
}
}
//检查完毕没有重复
return true;
}
}
查看10道真题和解析