强密码检验器 II
难度:
标签:
题目描述
代码结果
运行时间: 25 ms, 内存: 15.9 MB
/*
* 思路:
* 1. 使用Java Stream API检查各种条件。
* 2. 使用流处理集合和条件。
*/
import java.util.stream.IntStream;
public class StrongPasswordCheckerStream {
public static boolean isStrongPassword(String password) {
if (password.length() < 8) return false;
boolean hasLower = password.chars().anyMatch(Character::isLowerCase);
boolean hasUpper = password.chars().anyMatch(Character::isUpperCase);
boolean hasDigit = password.chars().anyMatch(Character::isDigit);
boolean hasSpecial = password.chars().anyMatch(ch -> "!@#$%^&*()-+".indexOf(ch) >= 0);
boolean noConsecutive = IntStream.range(1, password.length())
.noneMatch(i -> password.charAt(i) == password.charAt(i - 1));
return hasLower && hasUpper && hasDigit && hasSpecial && noConsecutive;
}
}
解释
方法:
此题解采用正则表达式来检查密码是否满足各项要求。首先检查密码长度是否大于等于8。接着依次检查密码中是否至少包含一个小写字母、一个大写字母、一个数字和一个特殊字符。最后检查密码中是否存在连续相同的字符。如果所有条件都满足,则返回True,否则返回False。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在正则表达式中使用`(.)\1+`是为了检查什么?这种表达方式是否准确地检测所有连续相同字符的情况?
▷🦆
为什么选择正则表达式作为验证各个条件的主要方法?是否存在其他可能更高效的实现方式?
▷🦆
代码中使用了多次正则表达式匹配。这种方法与单次遍历字符串检查所有条件有何优劣?
▷🦆
正则表达式中检查特殊字符使用了`[!@#$%^&*()\-+]`,其中的连字符`-`是否正确放置,以避免成为范围操作符?
▷