【牛客网 - 华为机试】HJ20 密码验证合格程序

题目描述

密码要求:

1.长度超过8位

2.包括大小写字母.数字.其它符号,以上四种至少三种

3.不能有相同长度大于2的子串重复

输入描述:
一组或多组长度超过2的字符串。每组占一行

输出描述:
如果符合要求输出:OK,否则输出NG

示例1
输入

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出

OK
NG
NG
OK

思路解析

直接暴力求解的,这个程序的话,求八位数和数字判断都很简单,最后一个使用三层循环去枚举三个的子串就可以了

然后如果有数字,数字项=true,如果有小写字母,小写字母项=true,有大写字母项,大写字母=true,有其他字符,其他字符=true,这四个变量加起来>=3就是合格的。

三层循环的判断的话可以先看i和j的范围以及遍历
i=0时
(012) 和(345)(456)(567)(678)(789)(89 10) 对比
i=1时
(123) 和(456)(567)(678)(789)(89 10) 对比
i=2时
(234) 和(567)(678)(789)(89 10) 对比

一次往下推导,得到i和j的循环起始和终止

for (int i = 0; i < chars.length - 5; i++) {
                for (int j = i + 3; j < chars.length - 2; j++) {

在这两层循环里面判断i到i+3 和j到j+3的大小,这里需要注意,如果说有长度为3的子串就一定会有长度为4的子串,所以只要找到长度为3的子串就可以了。

package 笔试汇总.华为;/**
 * Copyright (C), 2019-2021
 * author  candy_chen
 * date   2021/4/23 22:39
 *
 * @Classname HJ20
 * Description: 密码验证合格程序
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 密码要求:
 *
 * 1.长度超过8位
 *
 * 2.包括大小写字母.数字.其它符号,以上四种至少三种
 *
 * 3.不能有相同长度大于2的子串重复
 */
public class HJ20 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = null;
        StringBuffer sb = new StringBuffer();
        while ((input = br.readLine()) != null){
            //设置四种类型数据初始化为空,即false,有数据了就更改为true
            boolean[] flag = new boolean[4];
            char[] chars = input.toCharArray();

            //第一个条件 长度超过8位
            if (chars.length < 9){
                sb.append("NG").append("\n");
                continue;
            }

            //第二个条件  包括大小写字母.数字.其它符号,以上四种至少三种
            for (int i = 0;i < chars.length; i++){
                if ('A' <= chars[i] && chars[i] <= 'Z') {
                    flag[0] = true;
                } else if ('a' <= chars[i] && chars[i] <= 'z') {
                    flag[1] = true;
                } else if ('0' <= chars[i] && chars[i] <= '9') {
                    flag[2] = true;
                } else {
                    flag[3] = true;
                }
            }
            int count = 0;
            for (int i = 0;i < 4;i++){
                if (flag[i]){
                    count++;
                }
            }
            // 第三个条件
            boolean sign = true;        //不存在两个大于2的子串相同,即!(i=i+3,i+1=i+4,i+2=i+5)
            for (int i = 0; i < chars.length - 5; i++) {
                for (int j = i + 3; j < chars.length - 2; j++) {
                    if (chars[i] == chars[j] && chars[i + 1] == chars[j + 1] && chars[i + 2] == chars[j + 2]) {
                        sign = false;
                    }
                }
            }
            if (count >= 3 && sign){
                sb.append("OK").append("\n");
            }else {
                sb.append("NG").append("\n");
            }
        }
        System.out.println(sb.toString());
    }
}

posted @ 2021-04-23 23:06  your_棒棒糖  阅读(139)  评论(0编辑  收藏  举报