X耀员工爆料:月薪25K,其中25%看绩效。年终2-4个月,看个人绩效,5%公积金,一二四加班,周六加班有双倍工资

文摘   2024-12-09 12:28   陕西  
最近看到个爆料,说X耀的员工待遇是这样的:月薪25K,其中25%看绩效,年终根据个人表现有2-4个月工资,公积金5%,一二四加班,周六加班还能拿双倍工资。

不过,说实话,这种“卷”得有点狠的制度,不是每个人都能接受。

月薪虽高,但一旦和绩效挂钩,那就得拼了命去争取了。对于一些程序员来说,项目做不好,bug一堆,连绩效考核都能掉一大块。而且,年终奖和个人绩效挂钩,拿不满,真的拿不满。

但职场就是这样,你想要什么,就得为此付出什么。X耀的这套制度,虽然让人觉得有点“卷”,但起码也让人心里有数:你想要高薪,那就拼吧。

算法题:强密码检验器

聊一个常见的编程面试题:强密码检验器

根据题目要求,强密码通常有三个条件:

  1. 必须包含至少一个小写字母
  2. 必须包含至少一个大写字母
  3. 必须包含至少一个数字
  4. 必须包含至少一个特殊字符(比如 !@#$%^&*
  5. 密码的长度必须是 6 到 20 个字符之间
  6. 不能有三个连续相同的字符(比如 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);
    }
}

代码解析

  1. 判断字符类型:我们使用了 Character.isLowerCaseCharacter.isUpperCaseCharacter.isDigit 来判断字符是否属于小写、大写或者数字。同时,对于特殊字符,我们用 indexOf 来检测是否包含在给定的特殊字符集合中。

  2. 计算缺失的字符类型:如果某种类型的字符不满足要求,我们就将 missingType 计数器加一。

  3. 处理密码过短的情况:如果密码长度小于6,返回 6 - 密码长度 和缺失的字符类型数量之间的较大值。这是因为我们至少需要填充缺失的字符类型,或者填充缺失的字符使密码达到6个字符。

  4. 处理密码过长的情况:如果密码超过20个字符,我们计算密码中多余的字符数,然后通过删除多余字符来修复密码。

  5. 修复连续字符的情况:这个部分是个小技巧,如果密码中存在三个或更多相同字符的连续子串,我们需要替换其中的一些字符。这个替换操作的次数就是我们需要的“修复次数”。

其他考虑

  • 边界条件:如果密码的长度小于6,我们不仅要考虑字符类型缺失,还需要补充字符直至达到6个字符。
  • 密码过长:如果密码超过20个字符,不能直接通过减少字符的长度来解决问题。我们需要“修复”连续的相同字符,减少他们的数量。

小结

算法的核心思路就是判断密码是否符合基本要求(字符类型),然后再通过修复密码长度和连续字符来使其符合强密码的标准。这个题目其实是一个典型的字符串操作题目,合理分配时间复杂度和空间复杂度,确保每个条件都能高效地处理。

-END-


ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言

程序员老鬼
10年+老程序员,专注于AI知识普及,已打造多门AI课程,本号主要分享国内AI工具、AI绘画提示词、Chat教程、AI换脸、Chat中文指令、Sora教程等,帮助读者解决AI工具使用疑难问题。
 最新文章