某行员工因降薪,上吊维权~

文摘   2024-11-13 14:43   陕西  
今天我看到的这个新闻,真让我感到有点震惊。

没想到,竟然还有人因为降薪而选择极端方式来“维权”!这事发生在某大行的员工身上,听说他因为银行改制降薪,情绪失控,最后竟然选择上吊维权!


虽然很无奈,但不得不说,解决问题不应该依赖极端手段。

我们不是也经常遇到项目难度大、系统崩溃的情况吗?每次出问题,我们都得沉下心来调试、找到根本原因,而不是因为一个bug就选择摧毁整个系统。


工作和生活一样,遇到问题就去解决,不要轻易放弃。尤其是对待“降薪”这种事,适时调整心态,必要时可以选择跳槽,别让自己被压垮了。

其实所有行业都一样,都有太多的不确定因素,要想不被折叠真的要不断学习呀,所以我今天又给大家准备了一道经典算法题,快学起来!

算法题:最长有效括号

和大家聊一个经典的算法题:最长有效括号。要说这题嘛,它的难度不高,但要想在面试中拿到高分,还是得动点脑筋的。

首先,题目要求我们给定一个只包含 () 的字符串,求字符串中最长有效括号的长度。什么是有效括号呢?简单来说,就是一个括号匹配且完整的子串,比如“()`”,或者“(())”。看似简单,但细节上却不容忽视。

接下来,我带大家通过两种常见的解法来解决这个问题。一种是通过栈的方式,另一种是通过动态规划。两种方式各有千秋,选哪个就看个人偏好啦。

栈法是这类问题的经典解法。

在这道题中,我们利用栈来跟踪括号的匹配情况。栈里面不仅仅存放括号的索引,还可以帮助我们计算有效括号的长度。

简单来说,我们从左到右遍历字符串。当遇到一个左括号时,把它的索引推入栈中。当遇到右括号时,检查栈顶的元素。如果栈顶元素是一个左括号的索引,我们就认为形成了一个有效的括号对,然后更新最大有效括号的长度。

如果栈顶不是左括号的索引,说明这个右括号没有匹配的左括号,于是我们就把它当作一个新的起点,继续往后走。

下面是具体的代码实现:

public class Solution {
    public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack<>();
        stack.push(-1); // 初始化栈,存放-1作为基准点
        int maxLength = 0;

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);

            if (ch == '(') {
                stack.push(i); // 左括号,压入栈
            } else {
                stack.pop(); // 右括号,弹出栈顶元素
                if (stack.isEmpty()) {
                    stack.push(i); // 如果栈为空,说明当前右括号无匹配,设置新的基准点
                } else {
                    maxLength = Math.max(maxLength, i - stack.peek()); // 更新最大有效括号长度
                }
            }
        }
        return maxLength;
    }
}

动态规划
除了栈,我们还可以通过动态规划来解这道题。动态规划的思想是:通过记录每个位置上可能的有效括号的长度,逐步计算出最长有效括号的长度。

具体来说,我们用一个数组 dp 来存储到当前位置的最大有效括号长度。对于每个字符,若当前位置是右括号,并且它的前一个字符是左括号,那么我们就更新 dp[i] 的值。更新的公式如下:

  • 如果当前位置是左括号 (,则跳过,dp[i] = 0
  • 如果当前位置是右括号 ),如果它的前面是左括号 (,我们就把前面的那个左括号加入计算,dp[i] = dp[i-2] + 2
  • 如果当前位置是右括号 ),且前面是一个已经匹配的右括号,我们就需要检查前面的括号是否能和当前括号配对。

代码实现如下:

public class Solution {
    public int longestValidParentheses(String s) {
        int maxLength = 0;
        int[] dp = new int[s.length()];

        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == ')') {
                // 如果前一个字符是左括号,且当前字符是右括号
                if (s.charAt(i - 1) == '(') {
                    dp[i] = (i - 2 >= 0 ? dp[i - 2] : 0) + 2;
                } else {
                    // 如果前一个字符是右括号,检查前面的有效括号是否配对
                    int match = i - dp[i - 1] - 1;
                    if (match >= 0 && s.charAt(match) == '(') {
                        dp[i] = dp[i - 1] + 2 + (match - 1 >= 0 ? dp[match - 1] : 0);
                    }
                }
                maxLength = Math.max(maxLength, dp[i]);
            }
        }
        return maxLength;
    }
}

在上述两种方法中,栈法的时间复杂度是 O(n),空间复杂度也是 O(n)。

而动态规划的时间复杂度同样是 O(n),但是空间复杂度是 O(n) 由于我们使用了一个额外的数组。如果不想额外使用空间,我们还可以通过常数空间来优化这部分,使用两个变量来记录当前的最大长度。

这道题虽然看起来简单,但往往给初学者带来很大的困惑。很多人往往会卡在栈或者动态规划的实现上,尤其是在考虑如何更新最大长度的时候,总是容易掉进“坑”里。所以,大家在做这类题时,一定要仔细考虑不同情况,确保每一个细节都没有遗漏。


其实,算法这东西,最重要的就是多练习,慢慢积累经验。今天能解决问题,明天一定能遇到更有趣的挑战!

-END-


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

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

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