牛客网华为机试【密码验证合格程序】
程序员文章站
2024-03-11 22:15:49
...
文章目录
题目描述
密码要求:
- 长度超过8位
- 包括大小写字母.数字.其它符号,以上四种至少三种
- 不能有相同长度超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;
}
}
结果
上一篇: MySQL的函数有哪些呢?快来康康吧!