题解 | #密码验证合格程序#
密码验证合格程序
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; } }