欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-11 22:15:49
...

题目描述

密码要求:

  1. 长度超过8位
  2. 包括大小写字母.数字.其它符号,以上四种至少三种
  3. 不能有相同长度超2的子串重复
    说明:长度超过2的子串

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

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

示例
输入

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

输出

OK
NG
NG
OK

题目分析 & 部分java代码

首先过滤长度不符合的密码:当长度小于 8 就说明是不符合条件的密码。
使用字符串的 length() 方法得到长度,与 8 进行比较:

password.length() > 8;

然后是第二个条件:包括大小写字母.数字.其它符号,以上四种至少三种
有俩思路,一个是直接循环比较字符,若出现符合条件(字母,数字,其他)的字符,就记录为1(注意这里不是统计出现 次数,只要标记出来就行)。
最终求和即可得到符合条件的种类数目。

/**
     * 包括大小写字母.数字.其它符号,以上四种至少三种
     * @return
     */
    private static boolean checkCharAndNumberAndOther(String password){
        int[] count = new int[4];
        char[] chars = password.toCharArray();
        for (char ch : chars) {
            if (ch >= '0' && ch <= '9') {
                count[0] = 1;
            } else if (ch >= 'a' && ch <= 'z') {
                count[1] = 1;
            } else if (ch >= 'A' && ch <= 'Z') {
                count[2] = 1;
            } else {
                count[3] = 1;
            }
        }

        // 或者:return count[0] + count[1] + count[2] + count[3] >= 3;
        return Arrays.stream(count).sum() >= 3;
    }

第二个思路,使用正则表达式:

"[a-z]" 表示匹配从小写字母 a-z 中的一个
"[A-Z]" 表示匹配从大写字母 A-Z 中的一个
"[0-9]" 表示匹配数字 0-9 中的一个
"[^a-z0-9A-Z]" 表示不是 a-z、0-9、A-Z 中的字符
/**
     * 通过正则表达式匹配
     * 参考:https://www.runoob.com/regexp/regexp-rule.html、
     * https://www.nowcoder.com/profile/572308/codeBookDetail?submissionId=1518251
     * @param password 输入的密码
     * @return
     */
    private static boolean checkCharAndNumberAndOtherByRegexp(String password){
        int count = 0;
        String[] regexps = {"[a-z]","[A-Z]","[0-9]","[^a-z0-9A-Z]"};
        for (String regexp : regexps) {
            Pattern pattern = Pattern.compile(regexp);
            if (pattern.matcher(password).find()) {
                count++;
            }
        }

        return count >= 3;
    }

然后是重复子串的判断,从输入的密码串中截取3个字符作为子串。
然后,从源密码串开始查找,注意不要从 0 号位开始。
若能查找到,就说明是重复的;否则就是不重复的。

java 代码

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Pattern;

/**
 * Created by Feng on 2020/2/17 12:21
 * CurrentProject's name is java8
 */
public class Main {
    public static void main(String[] args) throws IOException {

        Scanner input = new Scanner(System.in);
        while(input.hasNextLine()){
            String password = input.nextLine();

			// 判断,这里可以更换为正则匹配的方法
            if(checkLength(password)&&
                checkCharAndNumberAndOther(password)&&
                checkRepeat(password)){
                System.out.println("OK");
            } else {
                System.out.println("NG");
            }
        }
    }

    /**
     * 校验长度:长度大于 8
     * @param password 输入的密码
     * @return 通过校验则返回 true
     */
    private static boolean checkLength(String password){
        return password.length() > 8;
    }

    /**
     * 包括大小写字母.数字.其它符号,以上四种至少三种
     * @return
     */
    private static boolean checkCharAndNumberAndOther(String password){
        int[] count = new int[4];
        char[] chars = password.toCharArray();
        for (char ch : chars) {
            if (ch >= '0' && ch <= '9') {
                count[0] = 1;
            } else if (ch >= 'a' && ch <= 'z') {
                count[1] = 1;
            } else if (ch >= 'A' && ch <= 'Z') {
                count[2] = 1;
            } else {
                count[3] = 1;
            }
        }

        // 或者:return count[0] + count[1] + count[2] + count[3] >= 3;
        return Arrays.stream(count).sum() >= 3;
    }


    /**
     * 通过正则表达式匹配
     * 参考:https://www.runoob.com/regexp/regexp-rule.html
     * @param password 输入的密码
     * @return
     */
    private static boolean checkCharAndNumberAndOtherByRegexp(String password){
        int count = 0;
        String[] regexps = {"[a-z]","[A-Z]","[0-9]","[^a-z0-9A-Z]"};
        for (String regexp : regexps) {
            Pattern pattern = Pattern.compile(regexp);
            if (pattern.matcher(password).find()) {
                count++;
            }
        }

        return count >= 3;
    }

    /**
     * 不能有相同长度超 2 的子串重复
     * @param password
     * @return 有重复时返回 false;
     */
    private static boolean checkRepeat(String password){
        for (int i = 0; i < password.length() - 2; i++) {
            String subString = password.substring(i, i+3);
            if(password.substring(i+1).contains(subString)){
                return false;
            }
        }
        return true;
    }
}


结果

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

相关标签: 牛客网华为机试