Python技术迷

现在的java后端已经没有大专学历了

最近聊到一个话题,觉得还挺有意思的——现在 Java 后端圈,大专学历根本进不去!

Image

这让我突然觉得有点迷茫,回头想想,我当年大专毕业,能混得还算不错,工作也有了一些经验。但如今,不管是外包公司还是大厂招聘,学历要求都已经开始高高在上,统招全日制本科几乎成了硬性标准。

我身边有几个老哥,他们技术实力一流,项目经验也超丰富,但面试一开始就被“学历”挡在了门外。你说这能不让人心酸吗?

不过,也能理解一些企业的做法。毕竟现在竞争激烈,找个能干的开发真不容易,学历成了最直接的筛选条件。对我们这些“老”程序员来说,可能更要拼的就是技术了,毕竟技术才是硬道理!

说到底,还是那句话:技术才是最靠谱的“学历”,不管外面怎么变,代码才是我们说话的资本!

算法题:重复叠加字符串匹配

今天我们来聊一个有点挑战性的算法题:重复叠加字符串匹配问题。

这种题目一看名字就知道,应该是有关字符串操作的经典问题了。看起来好像没什么特别的,但仔细一想,涉及到字符串的叠加和匹配,问题的复杂度其实可以挺高的。所以,我们要耐心一点,慢慢来,步步拆解。

问题描述

给定两个字符串 A 和 B,请你判断 B 是否可以通过将字符串 A 重复叠加若干次得到。换句话说,就是看我们通过将 A 拼接几次,能不能得到 B。你可以理解为:我们能不能通过复制粘贴 A ,把它凑成 B?

思考过程

首先我们可以从一个简单的角度入手。假设我们有 A = "abc" 和 B = "abcabcabc",那么问题的核心就变成了“能不能用若干个 A 拼接成 B”。如果我们不注意细节,可能会想到直接暴力遍历,看看能不能通过逐步叠加 A 来拼凑出 B,但这明显会超时,特别是当 B 很长时。

那么我们要怎么做呢?

关键点

首先,我们应该注意到一个本质问题:字符串 A 的长度必须能整除 B 的长度。否则,就算我们拼接再多次,也永远无法完全匹配 B。这一步就是一个非常关键的优化点。如果 len(B) % len(A) != 0,那就直接可以返回 False。毕竟,B 长度不是 A 长度的整数倍,根本无法完全由 A 拼接出来。

解法一:暴力法

首先,我们先从暴力法开始。我们可以通过循环,不断拼接 A,直到拼接出的字符串长度超过或等于 B 的长度。然后,比较拼接出的字符串和 B 是否一致。

代码实现如下:

def repeatedStringMatch(A: str, B: str) -> int:
    # 计算字符串 A 的长度和 B 的长度
    lenA, lenB = len(A), len(B)

        # 计算需要重复多少次才能覆盖 B
    repeat_count = (lenB + lenA - 1) // lenA  # ceil(lenB / lenA)

    # 拼接字符串 A
    for i in range(2):  # 至少重复两次,以防 A 结尾与 B 头部有重合
        repeated_A = A * (repeat_count + i)
        if repeated_A.startswith(B):
            return repeat_count + i

    return -1

解释

首先,我们通过 (lenB + lenA - 1) // lenA 计算出最小的重复次数。这个表达式相当于求了 ceil(lenB / lenA),也就是我们至少需要这么多次 A 来覆盖 B 的长度。然后,我们利用 startswith 方法来判断是否能从 A 重复后的字符串中,找到以 B 开头的部分。如果能找到,就返回重复的次数;如果找不到,返回 -1。

优化分析

暴力法虽然能解决问题,但效率不算高,特别是对于大的 B 字符串,拼接的次数会增多,时间复杂度会变得非常大。如果我们能找到更巧妙的方法来减少不必要的计算,那无疑会提升程序的效率。

解法二:优化思路

我们可以优化下思路,不直接拼接出整个字符串,而是只检查是否能通过某些重复操作生成 B。另外,有些小细节上我们可以做一些调整,比如直接通过字符串的长度关系来判断是否可能匹配。

优化版代码如下:

def repeatedStringMatch(A: str, B: str) -> int:
    if len(B) % len(A) != 0 and len(B) % len(A) != len(A) - len(B) % len(A):
        return -1
    repeats = (len(B) + len(A) - 1) // len(A) 
    if A * repeats == B:
        return repeats
    if A * (repeats + 1) == B:
        return repeats + 1
    return -1

总结

看到这里,你是不是觉得这道题其实没有想象中那么复杂了?通过计算 A 的重复次数,并结合字符串拼接的技巧,我们就能很轻松地解决这个问题。而且,像我说的,细节很重要,字符串的长度关系能帮助我们节省很多不必要的运算。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

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

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。