程序员老鬼

如何判断你是不是进了真国企?

怎么判断你是不是进了真国企、是不是进了真体制内?这是我最近在网上闲逛时,一网友的发帖,他也给出了方法,收护照的就是真国企。是这样吗?我读书少,你可不要骗我。

Image

而评论区第一条就是反驳的,“一眼假,明明这是银行才会有的奇葩规定,国企哪有这事儿。”本来我都信了他的邪。

Image

又有人跳出来补充,“副处级以上,或者涉密人员才收”这就很合理了。

Image

也有网友才不管这么多的,“说到底,不加班的才是真国企,其他都是假的。”默默给你点个赞,你是最通透的。

Image

最后,大佬出来说话了,“真国企得满足这几个条件:一是接收你的人事档案,不是随便一个人才市场就能存放的;二是得是国有独资的;三是有企业年金。”你字多,就信你了。

Image

看了一圈下来,大家说法都有点不一样,可能确实没有统一的标准,网友们的说法当个参考就好。但话又说回来,工作福利和个人成长符合我们的期望,就OK了,不是吗?

下面是今日的大厂算法题
现在环境就这样,不管是大厂还是小厂,笔面试都会问到算法,所以算法无疑是非常重要的。下面是今日算法题,来自LeetCode的第44题:通配符匹配,下面是我的算法思路及实现,让我们来看看吧。
算法题目

给定一个字符串 (s) 和一个字符模式 (p),实现一个支持 '?' 和 '*' 的通配符匹配。

  • '?' 可以匹配任何单个字符。

  • '*' 可以匹配任意字符串(包括空字符串)。

两个字符串完全匹配才算匹配成功。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。

  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

算法思路

动态规划是解决此类问题的一个有效方法。我们可以使用一个二维数组 dp 来存储中间结果,其中 dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否能够匹配。

  1. 初始化:dp[0][0] = true,因为两个空字符串是可以匹配的。接下来,对于 p 的前 j 个字符如果都是 *,那么 dp[0][j] = true。

  2. 状态转移:

  • 如果 p[j - 1] == s[i - 1] || p[j - 1] == '?',则 dp[i][j] = dp[i - 1][j - 1]。

  • 如果 p[j - 1] == '*',则 dp[i][j] = dp[i][j - 1] || dp[i - 1][j]。dp[i][j - 1] 表示 * 匹配空字符串,dp[i - 1][j] 表示 * 匹配至少一个字符。

  • 最终答案为 dp[s.length()][p.length()]。

  • 代码实现
    Java实现
    public class Solution {    public boolean isMatch(String s, String p) {        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];        dp[0][0] = true;        for (int j = 1; j <= p.length(); j++) {            if (p.charAt(j - 1) == '*') {                dp[0][j] = dp[0][j - 1];            }        }        for (int i = 1; i <= s.length(); i++) {            for (int j = 1; j <= p.length(); j++) {                if (p.charAt(j - 1) == s.charAt(i - 1) || p.charAt(j - 1) == '?') {                    dp[i][j] = dp[i - 1][j - 1];                } else if (p.charAt(j - 1) == '*') {                    dp[i][j] = dp[i][j - 1] || dp[i - 1][j];                }            }        }        return dp[s.length()][p.length()];    }}
    JavaScript实现
    function isMatch(s, p) {  let dp = Array(s.length + 1).fill(false).map(() => Array(p.length + 1).fill(false));  dp[0][0] = true;
    for (let j = 1; j <= p.length; j++) { if (p[j - 1] === '*') { dp[0][j] = dp[0][j - 1]; } }
    for (let i = 1; i <= s.length; i++) { for (let j = 1; j <= p.length; j++) { if (p[j - 1] === s[i - 1] || p[j - 1] === '?') { dp[i][j] = dp[i - 1][j - 1]; } else if (p[j - 1] === '*') { dp[i][j] = dp[i][j - 1] || dp[i - 1][j]; } } }
    return dp[s.length][p.length];}
    Go实现
    package main
    func isMatch(s string, p string) bool { dp := make([][]bool, len(s)+1) for i := range dp { dp[i] = make([]bool, len(p)+1) } dp[0][0] = true
    for j := 1; j <= len(p); j++ { if p[j-1] == '*' { dp[0][j] = dp[0][j-1] } }
    for i := 1; i <= len(s); i++ { for j := 1; j <= len(p); j++ { if p[j-1] == s[i-1] || p[j-1] == '?' { dp[i][j] = dp[i-1][j-1] } else if p[j-1] == '*' { dp[i][j] = dp[i][j-1] || dp[i-1][j] } } }
    return dp[len(s)][len(p)]}
    算法解析
    此算法的时间复杂度为O(nm),空间复杂度也为 O(nm),其中n是字符串 s 的长度,m 是模式 p 的长度。通过动态规划,我们能够有效地解决包含通配符的复杂匹配问题。
    示例和测试

    以 s = "adceb" 和 p = "*a*b" 为例,按照上述算法步骤执行,可以得到结果 true。

    测试代码可以根据上述实现直接运行,以验证算法的正确性。

    总结
    通配符匹配是一种重要的字符串匹配问题,它的解法涉及到动态规划等高级算法技巧。
    Image

    扫描下方二维码,购买《ChatGPT实战课程》
    送ChatGPT独享账号!

    Image

    课程包含超多ChatGPT前沿玩法,帮助大家熟练掌握ChatGPT!

    推荐阅读:

    Image