近日,全国人大代表、小米集团创始人雷军在采访中提到,人工智能时代可能会重塑许多职场规则,甚至催生全新的岗位。他鼓励大家以开放的心态拥抱变化,并展望未来可能不再需要“朝九晚五”的传统工作模式,或许每周只需工作更短的时间,生活质量和工作质量都将大幅提升。
这让我联想到最近颇受关注的开源智能体项目,它们宣称能辅助处理邮件、制作PPT、编写代码乃至操作电脑。AI时代似乎真的在加速到来。作为一名技术人,除了关注行业动态,扎实的算法功底依然是应对变化的核心竞争力之一。
那么,不妨回归代码,通过一道经典的LeetCode题目来保持思维的敏锐度。在探讨“未来工作制”之余,我们也来看看如何在算法世界里解决一个具体的问题。

网友们对此议论纷纷,有人充满期待,也有人基于现实提出质疑。无论未来如何,提升自身技能总是没错的。

接下来,让我们聚焦今天的技术主题:LeetCode 1980题——找出不同的二进制字符串。这是一道中等难度的题目,非常考验对二进制和基本算法技巧的理解。
问题描述
给你一个字符串数组 nums,该数组由 n 个互不相同的二进制字符串组成,且每个字符串长度都是 n。请你找出并返回一个长度为 n 且没有出现在 nums 中的二进制字符串。如果存在多种答案,只需返回 任意一个 即可。
示例 1:
输入:nums = [“00”, “01”]
输出:“11”
解释:“11” 没有出现在 nums 中。“10” 也是正确答案。
示例 2:
输入:nums = [“111”, “011”, “001”]
输出:“101”
解释:“101” 没有出现在 nums 中。“000”、“010”、“100”、“110” 也是正确答案。
提示:
n == nums.length
1 <= n <= 16
nums[i].length == n
nums[i] 为 ‘0’ 或 ‘1’
nums 中的所有字符串 互不相同
解题思路分析
题目给出了一个关键约束:数组长度为 n,且每个二进制字符串的长度也是 n。长度为 n 的二进制字符串总共可能有 2^n 种(从 0 到 2^n - 1)。而我们的数组 nums 只包含了 n 个互不相同的字符串。
由于 n <= 16,所以 2^n 最大为 65536,这是一个可以接受的处理范围。核心思路是:
- 将所有出现的二进制字符串转换为对应的十进制整数。
- 标记这些整数已经出现过。
- 从
0 到 2^n - 1 的范围内,寻找第一个未被标记的整数。
- 将该整数转换回长度为
n 的二进制字符串(注意补齐前导零)并返回。
这种方法利用了哈希表的思想(这里用布尔数组模拟)来快速查找缺失项,是解决此类“查找缺失元素”问题的有效手段。
代码实现
Java 版本
public String findDifferentBinaryString(String[] nums) {
int n = nums.length;
// vis[i]表示数字 i 是否存在
boolean[] vis = new boolean[1 << n];
for (String num : nums)
vis[Integer.parseInt(num, 2)] = true;
int ans = 0;
for (int i = 0; i < 1 << n; i++) { // 查找第一个不存在的数字
if (!vis[i]) {
ans = i;
break;
}
}
StringBuilder sb = new StringBuilder(Integer.toBinaryString(ans));
while (sb.length() < n) // 补齐前导0
sb.insert(0, “0”);
return sb.toString();
}
C++ 版本
public:
string findDifferentBinaryString(vector<string>& nums) {
int n = nums.size();
// vis[i]表示数字 i 是否存在
vector<bool> vis(1 << n, false);
for (const string &num: nums)
vis[stoi(num, nullptr, 2)] = true;
int ans = 0;
for (int i = 0; i < 1 << n; i++) { // 查找第一个不存在的数字
if (!vis[i]) {
ans = i;
break;
}
}
// 将十进制数转换为二进制字符串(无前置0)
string binary_str = bitset<32>(ans).to_string();
// 截取最后n位(因为bitset会生成32位字符串,前面都是0)
binary_str = binary_str.substr(32 - n);
return binary_str;
}
Python 版本
def findDifferentBinaryString(self, nums: List[str]) -> str:
n = len(nums)
# 使用集合记录已出现的数字,查找效率更高
exist_set = {int(num, 2) for num in nums}
total = 1 << n # 2^n
for i in range(total):
if i not in exist_set:
# 使用格式化将整数转为指定位数的二进制字符串,自动补零
return f“{i:0{n}b}”
return “” # 根据题意,此处不会执行到

总结
无论是面对AI带来的未来工作模式变革,还是解决一道具体的算法题,核心都在于理解问题本质并掌握有效的解决方法。这道题巧妙地利用了二进制数的特性与查找空间有限的条件,提供了一种清晰高效的解法。
对于技术人而言,持续学习、深入理解数据结构与算法的基本原理,是在任何时代都不可或缺的能力。如果你对这类题目感兴趣,或想与其他开发者交流解题心得,欢迎来到云栈社区一起探讨。毕竟,在AI能替我们写代码之前,我们先得学会如何指挥它,不是吗?