现在的java后端已经没有大专学历了
最近聊到一个话题,觉得还挺有意思的——现在 Java 后端圈,大专学历根本进不去!
这让我突然觉得有点迷茫,回头想想,我当年大专毕业,能混得还算不错,工作也有了一些经验。但如今,不管是外包公司还是大厂招聘,学历要求都已经开始高高在上,统招全日制本科几乎成了硬性标准。
我身边有几个老哥,他们技术实力一流,项目经验也超丰富,但面试一开始就被“学历”挡在了门外。你说这能不让人心酸吗?
不过,也能理解一些企业的做法。毕竟现在竞争激烈,找个能干的开发真不容易,学历成了最直接的筛选条件。对我们这些“老”程序员来说,可能更要拼的就是技术了,毕竟技术才是硬道理!
说到底,还是那句话:技术才是最靠谱的“学历”,不管外面怎么变,代码才是我们说话的资本!
算法题:重复叠加字符串匹配
今天我们来聊一个有点挑战性的算法题:重复叠加字符串匹配问题。
这种题目一看名字就知道,应该是有关字符串操作的经典问题了。看起来好像没什么特别的,但仔细一想,涉及到字符串的叠加和匹配,问题的复杂度其实可以挺高的。所以,我们要耐心一点,慢慢来,步步拆解。
问题描述
给定两个字符串 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高级架构师资料合集》。