大家好,我是苍何。
就在上个月的 20 号,在武汉举行了「2024开放原子开发者大会」,会上工业和信息化部负责人宣布了一项重要数据:
我国软件开发者群体规模已历史性突破940万大关,其中武汉地区有40万。
而且在开源上,我国已经成为全球开源参与者数量第二多的国家,其增长速度更是全球第一。
好家伙,940 万什么概念?白俄罗斯一整个国家的人口也才约 915 万。
这个数据可谓是相当的庞大,统计口径就得先明确什么是软件开发者?我问了下 AI,他给的解释是:
软件开发者(Software Developer)是指那些从事软件开发工作的专业人士。他们的主要职责是编写、测试、维护和更新计算机程序和应用程序。
这 940 万中有 Java 开发、安卓开发、IOS 开发、C++开发、前端开发等等,种类很多。
我们再来看看全球开发者数量有多少呢?按照 Evans Data Corporation 预测统计,2024 年全球开发者预计 2870 万。
按照换算的话,940 万占据了约全球的 32.75%。
当然了,这种计算方式没有意义,因为两者的统计口径会有出入。
你以为这个数据就已经很多了,但我估计 2025 之后这个数据会更多,为什么呢?因为新的程序员即将来临。
他们或许是不写代码的产品经理,或许是只会写小说的小说家,又或许是路边摆摊的大爷。
用上了 AI 后,人人都变得会设计 APP,开发网站,他们甚至不用写一行代码也能成为新时代的程序员。
我记得前段时间很火的产品经理花生,通过一个简单的不能再简单的 APP 一度爆火。
很多程序员,技术大佬,觉得就这么简单的产品有什么好吹牛的。
但恰恰相反,人家抓住了用户痛点和需求,借助 AI,上线产品,满足了很多人的需求。
所以,理论上,我们也应该把花生这样的产品经理也算是程序员,
未来,程序员不一定只会写代码,只会写代码的不一定是程序员。
我的读者中也有很多的程序员,在 AI 来临的时候,外界都在高喊,AI 第一个要革的就是程序员的命,很多人和我反馈说:
不可能。我有经验,我不可能会被取代。
现在的 AI 编程能商业化落地一整个项目的几乎没有,大部分还在起到辅助的作用,所以很多人认为短期内,取代程序员不大现实。
但现在没有,并不代表未来没有。
我很喜欢罗振宇老师今年跨年演讲中引用任总的这么一段话:
蓝军存在于方方面面,内部的任何方面都有蓝军。在你的思想里面也有红蓝对决,我认为人的一生中从来都是红蓝对决的。
什么意思呢?从企业的角度来看,我们需要成立专门的「蓝军」团队,专门来想办法干倒这家公司,发现存在的不足和问题。
于个人而言,我认为更需要蓝军。你看似引以为傲的技术技能,你曾经引以为傲的大厂光环,这些在 AI 时代下,都可能颠覆你的认知,他们或许都将被取代。
我们需要在思想层面组建蓝军,先去各种体验 AI,去想办法为我们提效,想办法去替代我们现在的工作。
自己先革自己的命,总比哪天别人革你的命好吧。
好啦,又说多了,一点小小的认知,如果和你想法有出入,欢迎评论区讨论,不许锤我,长得好看也不行🐶
…
回归主题。
今天来一道简单的面试算法题,给枯燥的牛马生活加加油😂。
题目描述
平台:LeetCode
题号:3
题目描述:无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 **子串** 的长度,"pwke" 是一个子序列,不是子串。
提示:
- 0≤s.length≤5×1040 \leq s.\text{length} \leq 5 \times 10^4
- ss 由英文字母、数字、符号和空格组成。
解题思路
这个问题可以用 滑动窗口 技巧来解决:
-
定义滑动窗口:
- 窗口是一个动态范围,初始时窗口为空。
- 我们用两个指针
left
和right
来表示窗口的左右边界。
-
维护窗口内的无重复字符:
- 用一个哈希集合(
set
)存储当前窗口内的字符。 - 如果遇到重复字符,就移动
left
缩小窗口,直到窗口中不再有重复字符。
- 用一个哈希集合(
-
更新结果:
- 每次移动
right
扩大窗口时,检查当前窗口的长度是否大于之前的最大长度,并更新结果。
- 每次移动
-
复杂度分析:
- 时间复杂度:O(n)O(n),每个字符最多被访问两次(一次由
right
扩展窗口,一次由left
缩小窗口)。 - 空间复杂度:O(k)O(k),kk 是字符集的大小(ASCII 字符的数量为 128)。
- 时间复杂度:O(n)O(n),每个字符最多被访问两次(一次由
代码实现
Java 实现
import java.util.HashSet;
public class LongestSubstringWithoutRepeating {
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set = new HashSet<>();
int maxLength = 0;
int left = 0;
for (int right = 0; right < s.length(); right++) {
// 如果有重复字符,则移动左指针缩小窗口
while (set.contains(s.charAt(right))) {
set.remove(s.charAt(left));
left++;
}
// 添加当前字符到集合并更新最大长度
set.add(s.charAt(right));
maxLength = Math.max(maxLength, right - left + 1);
}
return maxLength;
}
public static void main(String[] args) {
LongestSubstringWithoutRepeating solution = new LongestSubstringWithoutRepeating();
System.out.println(solution.lengthOfLongestSubstring("abcabcbb")); // 输出: 3
System.out.println(solution.lengthOfLongestSubstring("bbbbb")); // 输出: 1
System.out.println(solution.lengthOfLongestSubstring("pwwkew")); // 输出: 3
}
}
C++ 实现
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> charSet;
int maxLength = 0;
int left = 0;
for (int right = 0; right < s.size(); right++) {
// 如果遇到重复字符,缩小窗口
while (charSet.find(s[right]) != charSet.end()) {
charSet.erase(s[left]);
left++;
}
// 将当前字符加入集合并更新最大长度
charSet.insert(s[right]);
maxLength = max(maxLength, right - left + 1);
}
return maxLength;
}
};
int main() {
Solution solution;
cout << solution.lengthOfLongestSubstring("abcabcbb") << endl; // 输出: 3
cout << solution.lengthOfLongestSubstring("bbbbb") << endl; // 输出: 1
cout << solution.lengthOfLongestSubstring("pwwkew") << endl; // 输出: 3
return 0;
}
Python 实现
def length_of_longest_substring(s: str) -> int:
char_set = set()
max_length = 0
left = 0
for right in range(len(s)):
# 如果有重复字符,缩小窗口
while s[right] in char_set:
char_set.remove(s[left])
left += 1
# 将当前字符加入集合并更新最大长度
char_set.add(s[right])
max_length = max(max_length, right - left + 1)
return max_length
# 测试
print(length_of_longest_substring("abcabcbb")) # 输出: 3
print(length_of_longest_substring("bbbbb")) # 输出: 1
print(length_of_longest_substring("pwwkew")) # 输出: 3
复杂度
- 时间复杂度: O(n)O(n)
- 空间复杂度: O(k)O(k),其中 kk 是字符集大小(最多 128 个字符)。
ending
一个人可以走得很快,但一群人才能走得更远。苍何的编程星球已经有 6800 多名球友加入了,如果你也需要一个优质的学习环境,戳链接 🔗 加入我们吧。这是一个 编程学习指南 + Java 项目实战 + LeetCode 刷题 + 简历精修 的私密圈子,你可以阅读星球专栏、向苍何提问、帮你制定学习计划、和球友一起打卡成长。
两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远。
欢迎点击左下角阅读原文了解苍何的编程星球,这可能是你学习求职路上最有含金量的一次点击。
最后,把苍何的座右铭送给大家:我举手向苍穹,并非一定摘到星月,只是想保持这个永不屈服的姿势。共勉 💪。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉