题解 | #密码验证合格程序#

密码验证合格程序

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;
    }
    
    
}


全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务