不过,说实话,这种“卷”得有点狠的制度,不是每个人都能接受。
月薪虽高,但一旦和绩效挂钩,那就得拼了命去争取了。对于一些程序员来说,项目做不好,bug一堆,连绩效考核都能掉一大块。而且,年终奖和个人绩效挂钩,拿不满,真的拿不满。
但职场就是这样,你想要什么,就得为此付出什么。X耀的这套制度,虽然让人觉得有点“卷”,但起码也让人心里有数:你想要高薪,那就拼吧。
算法题:强密码检验器
聊一个常见的编程面试题:强密码检验器。
根据题目要求,强密码通常有三个条件:
必须包含至少一个小写字母 必须包含至少一个大写字母 必须包含至少一个数字 必须包含至少一个特殊字符(比如 !@#$%^&*
)密码的长度必须是 6 到 20 个字符之间 不能有三个连续相同的字符(比如 aaa
)
听起来有点复杂?别担心,咱们来一步步拆解这个问题。
问题分析
我们可以把这个题目分成两个部分来处理:首先是验证密码是否符合基本要求,其次是处理密码长度过长或者过短的情况。也就是说,首先要检查是否满足所有的条件,然后再做一些必要的调整。
假设我们有一个密码字符串 password
,那么我们的目标就是判断它是否符合强密码的标准。
代码实现
首先,我们先检查密码的基本条件:是否包含大写字母、小写字母、数字和特殊字符。
public class StrongPasswordChecker {
public int strongPasswordChecker(String password) {
// 定义一些标志,记录密码是否包含相应的字符类型
boolean hasLower = false;
boolean hasUpper = false;
boolean hasDigit = false;
boolean hasSpecial = false;
// 遍历密码字符串,判断包含的字符类型
for (char ch : password.toCharArray()) {
if (Character.isLowerCase(ch)) {
hasLower = true;
} else if (Character.isUpperCase(ch)) {
hasUpper = true;
} else if (Character.isDigit(ch)) {
hasDigit = true;
} else if ("!@#$%^&*()_-+=<>?".indexOf(ch) != -1) {
hasSpecial = true;
}
}
// 统计缺少的字符类型
int missingType = 0;
if (!hasLower) missingType++;
if (!hasUpper) missingType++;
if (!hasDigit) missingType++;
if (!hasSpecial) missingType++;
// 如果密码长度小于6,直接返回缺少的字符类型数量 + 6 - 密码长度
if (password.length() < 6) {
return Math.max(6 - password.length(), missingType);
}
// 如果密码长度大于20,删除多余的字符,并修复连续相同字符
int lengthOverage = Math.max(0, password.length() - 20);
int replacements = 0;
// 修复连续字符
int i = 2;
while (i < password.length()) {
if (password.charAt(i) == password.charAt(i - 1) && password.charAt(i - 1) == password.charAt(i - 2)) {
int length = 2;
while (i < password.length() && password.charAt(i) == password.charAt(i - 1)) {
i++;
length++;
}
replacements += length / 3;
} else {
i++;
}
}
return Math.max(missingType, lengthOverage + replacements);
}
}
代码解析
判断字符类型:我们使用了
Character.isLowerCase
、Character.isUpperCase
、Character.isDigit
来判断字符是否属于小写、大写或者数字。同时,对于特殊字符,我们用indexOf
来检测是否包含在给定的特殊字符集合中。计算缺失的字符类型:如果某种类型的字符不满足要求,我们就将
missingType
计数器加一。处理密码过短的情况:如果密码长度小于6,返回
6 - 密码长度
和缺失的字符类型数量之间的较大值。这是因为我们至少需要填充缺失的字符类型,或者填充缺失的字符使密码达到6个字符。处理密码过长的情况:如果密码超过20个字符,我们计算密码中多余的字符数,然后通过删除多余字符来修复密码。
修复连续字符的情况:这个部分是个小技巧,如果密码中存在三个或更多相同字符的连续子串,我们需要替换其中的一些字符。这个替换操作的次数就是我们需要的“修复次数”。
其他考虑
边界条件:如果密码的长度小于6,我们不仅要考虑字符类型缺失,还需要补充字符直至达到6个字符。 密码过长:如果密码超过20个字符,不能直接通过减少字符的长度来解决问题。我们需要“修复”连续的相同字符,减少他们的数量。
小结
算法的核心思路就是判断密码是否符合基本要求(字符类型),然后再通过修复密码长度和连续字符来使其符合强密码的标准。这个题目其实是一个典型的字符串操作题目,合理分配时间复杂度和空间复杂度,确保每个条件都能高效地处理。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。