HJ20 密码验证合格程序(java)(代码解释超清晰)

Hello World(你好,世界!)

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String str = sc.nextLine().replaceAll(" ", "");//输入字符串将空格替换成空

            // 1.长度超过8位
            if (str.length() < 8) {
                System.out.println("NG");//如果输入的字符长度超过8位则不符合
                continue;//继续下一次while输入
            }

            // 2.包括大小写字母.数字.其它符号,以上四种至少三种
            /**
             * count:种数
             * length:用于判断每次replaceAll后长度是否变化,变化,则count++
             */
            int count = 0;//记录大小写字母.数字.其它符号这四种类型
            int length = str.length();//去除空格之后的字符串长度
            String temp = str.replaceAll("[a-z]", "");//判断temp中是否有小写字母,[a-z]代表正则表达式,abcd...xyz([]表示多个替换,而非单个,如果不知道这个知识点的话,可以去搜一下正则表达式[]的用处),此刻有的话就把从a-z的全部小写字母全给替换成""空
            if (temp.length() < length) {//判断此刻长度是否减少了,如果减少了,说明原来的temp中的确有小写字母被替换成了""空导致字符串长度减少
                count++;//此刻count=count+1 表示拥有一个小写字母类型
                length = temp.length();//更新字符串长度
            }
            
            temp = temp.replaceAll("[A-Z]", "");//判断temp中是否有大写字母,[A-Z]代表正则表达式,ABCD...XYZ,此刻有的话就把从A-Z的全部大写字母全给替换成""空
            if (temp.length() < length) {//判断此刻长度是否减少了,如果减少了,说明原来的temp中的确有大写字母被替换成了""空导致字符串长度减少
                count++;//此刻count=count+1 表示拥有一个大写字母类型
                length = temp.length();//更新字符串长度
            }
            
            temp = temp.replaceAll("[0-9]", "");//判断temp中是否有数字,[0-9]代表正则表达式,012...789,此刻有的话就把从0-9的全部数字全给替换成""空
            if (temp.length() < length) {//此刻count=count+1 表示拥有一个数字类型
                count++;//更新字符串长度
            }
            
            
            if (temp.length() > 0) {// 此刻temp里面仍旧有字符 !=0 说明有非 大 小写字母、数字 的字符
                count++;//此刻count=count+1 表示拥有一个非 大 小写字母、数字 的字符类型
            }

            if (count < 3) {//如果字符类型不>=3则说明这个temp不符合题意
                System.out.println("NG");//输出NG
                continue;
            }

            // 3.判断是否有重复的3个字符
            // 要求是不能超过2个,所以这里直接判断3个即可,因为三个这个字符串就不符合题意了.也可以判断4,5,6,但是没得必要,有4,5个重复,肯定3个重复啊.
            //类似于窗口滑动问题,就是子字符串长为3与后续的n-3长度的字串相比是否重复
            boolean flag = false;

            for (int i = 0; i < str.length() - 2; i++) {//因为长度为三的窗口在n上滑动,子窗口的头序号只能为0-n-3.例如长为5,子窗口长为3,子窗口只能从序号0-2,1-3,2-4(为啥是4,因为长为5序号最大就是为4.)
                String t = str.substring(i, i + 3);//第一个长度为3的子窗口

                String tt = str.substring(i + 3);//第二个长度为n-3的子窗口

                if (tt.contains(t)) {//两个子窗口匹配,说明有重复的
                    flag = true;
                    break;
                }
            }
            System.out.println(flag ? "NG" : "OK");//如果flag为true则返回NG,否则flag不为true返回OK
        }
    }

//解析的够详细了,就看你愿不愿意看喽,其实也就是个滑动窗口最后的判断最难点了,这道题也就这个地方有点价值. wc 一直标注那么多 搞得我 习惯性的打上了// 哈哈

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值