找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4025

积分

0

好友

542

主题
发表于 15 小时前 | 查看: 5| 回复: 0

近日,全国人大代表、小米集团创始人雷军在采访中提到,人工智能时代可能会重塑许多职场规则,甚至催生全新的岗位。他鼓励大家以开放的心态拥抱变化,并展望未来可能不再需要“朝九晚五”的传统工作模式,或许每周只需工作更短的时间,生活质量和工作质量都将大幅提升。

这让我联想到最近颇受关注的开源智能体项目,它们宣称能辅助处理邮件、制作PPT、编写代码乃至操作电脑。AI时代似乎真的在加速到来。作为一名技术人,除了关注行业动态,扎实的算法功底依然是应对变化的核心竞争力之一。

那么,不妨回归代码,通过一道经典的LeetCode题目来保持思维的敏锐度。在探讨“未来工作制”之余,我们也来看看如何在算法世界里解决一个具体的问题。

社交媒体上关于雷军AI时代工作制言论的讨论截图

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

技术社区网友对相关话题的评论截图

接下来,让我们聚焦今天的技术主题: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 种(从 02^n - 1)。而我们的数组 nums 只包含了 n 个互不相同的字符串。

由于 n <= 16,所以 2^n 最大为 65536,这是一个可以接受的处理范围。核心思路是:

  1. 将所有出现的二进制字符串转换为对应的十进制整数。
  2. 标记这些整数已经出现过。
  3. 02^n - 1 的范围内,寻找第一个未被标记的整数。
  4. 将该整数转换回长度为 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能替我们写代码之前,我们先得学会如何指挥它,不是吗?




上一篇:AI自主进化与经济模式重塑:从马斯克预言看技术奇点与人类价值
下一篇:下一个排列算法详解:LeetCode 31题解法与华为腾讯等大厂面试原题分析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-16 23:03 , Processed in 0.552944 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表