华子员工吐槽:感谢把我裁了,从年薪40万,降薪到国企25万,没有绩效压力,965。。

科技   2024-12-07 11:32   陕西  

最近网上看到一个帖子:华子员工吐槽,感谢公司把他裁了!他从年薪40万的互联网公司,直接降薪到国企25万,虽然少了15万工资,但“没有了绩效压力,996也不见了,甚至成了真正的‘965’”。


作为程序员,年薪40万在互联网行业已经算不错了,尤其是在拼劲力、拼加班的环境下,每天都在为KPI和项目而奋斗,压力山大。
而突然被裁后进入国企,虽然工资少了,但工作节奏彻底放缓,没有了每日的战斗,反而变得轻松了。
这让我想到我们程序员的普遍状态——压力大,工作时间长。很多时候,年薪高了,换来的却是更加恶劣的工作环境。
当然,减少薪资换来的是生活质量的提升。对于这个员工来说,或许他真正意识到,生活不一定要拼命挣钱,能有时间陪家人、享受生活也挺好的

算法:交错字符串

今天我们来聊一个看似简单,但实际上挺考脑力的算法题:交错字符串(Interleaving String)。
这个问题常常出现在面试中,尤其是当你准备应对那些看似“基础”的题目时,突然一题让你炸裂。别担心,我来带你一起破解这道题。
题目大致是这样的:给定三个字符串 s1s2s3,判断 s3 是否是由 s1s2 交错拼接而成。交错拼接意味着 s3 中的字符可以从 s1s2 中依次选取,且选取的顺序要保持不变。
举个例子,假设:
  • s1 = "abc"
  • s2 = "def"
  • s3 = "adbcef"
这就符合交错字符串的定义,因为你可以从 s1s2 中按顺序取字符,最终拼出 s3
那我们该怎么做呢?用什么方法来判断呢?对于这种问题,很多程序员的第一反应是暴力递归,但考虑到问题的规模,我们需要稍微优化一下,避免超时。
我们可以通过动态规划来高效地解决这个问题。动态规划的思路是,定义一个二维的布尔数组 dp,其中 dp[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符是否可以交错拼接成 s3 的前 i + j 个字符。
具体做法是这样的:
  1. 首先,我们要确保 s1s2 的长度之和正好等于 s3 的长度。如果不等,直接返回 false
  2. 然后,我们使用动态规划来填充 dp 数组。dp[i][j] 只有在以下两种情况之一成立时才为 true
  • dp[i-1][j]trues1[i-1] == s3[i+j-1],即从 s1 取一个字符
  • dp[i][j-1]trues2[j-1] == s3[i+j-1],即从 s2 取一个字符
最终,dp[s1.length()][s2.length()] 就是答案,如果为 true,说明可以交错拼接;否则,不能。
代码如下:
public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        // 如果s1和s2的长度之和不等于s3的长度,直接返回false
        if (s1.length() + s2.length() != s3.length()) {
            return false;
        }

        boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];

        // 初始状态,dp[0][0]是true,因为两个空字符串可以交错拼接成空字符串
        dp[0][0] = true;

        // 填充dp数组
        for (int i = 0; i <= s1.length(); i++) {
            for (int j = 0; j <= s2.length(); j++) {
                if (i > 0 && dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) {
                    dp[i][j] = true;
                }
                if (j > 0 && dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1)) {
                    dp[i][j] = true;
                }
            }
        }

        return dp[s1.length()][s2.length()];
    }
}
这段代码里,首先我们检查了 s1s2 的长度之和是否等于 s3 的长度,这是一个基础的预处理步骤。然后我们创建了一个二维布尔数组 dp,并通过两层循环来填充它。每次检查 dp[i][j] 是否能从 dp[i-1][j]dp[i][j-1] 转移过来,并确保字符匹配。
最终,返回 dp[s1.length()][s2.length()] 就是我们要的结果。只要这个值为 true,就说明 s3 可以由 s1s2 交错拼接。
对于时间复杂度,显然是 O(m * n),其中 mn 分别是 s1s2 的长度。这个算法相较于暴力递归来说,效率提升了很多,避免了重复计算。
而空间复杂度是 O(m * n),因为我们用了一个二维数组来保存状态。空间复杂度还可以优化为 O(n),通过滚动数组来实现。

小总结:

这道题目考察了我们对动态规划的理解,特别是在字符串匹配问题上的应用。虽然问题看起来不复杂,但如果没有合适的优化方法,暴力递归可能会让我们在面试中掉进时间复杂度陷阱。
如果你正在准备面试,这类问题可以多做几遍,熟悉动态规划的思路,并学会优化空间复杂度。
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。


🔥东哥私藏精品 热门推荐🔥

东哥作为一名超级老码农,整理了全网最全《Java高级架构师资料合集》

资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。

Java面试那些事儿
回复 java ,领取Java面试题。分享AI编程,Java教程,Java面试辅导,Java编程视频,Java下载,Java技术栈,AI工具,Java开源项目,Java简历模板,Java招聘,Java实战,Java面试经验,IDEA教程。
 最新文章