leetcode 2026-03-08 每日一练 - 找出不同的二进制字符串

leetcode 2026-03-08 每日一练 - 找出不同的二进制字符串
Austoin题目描述
LeetCode 1980. 找出不同的二进制字符串
给你一个字符串数组 nums,其中有 n 个 互不相同 的二进制字符串,且每个字符串长度都为 n。
请返回一个长度为 n 且没有出现在 nums 中的二进制字符串。若有多个答案,返回任意一个即可。
示例 1:
- 输入:
nums = ["01","10"] - 输出:
"11" - 解释:
"11"不在nums中,"00"也是合法答案
示例 2:
- 输入:
nums = ["00","01"] - 输出:
"11" - 解释:
"11"不在nums中,"10"也是合法答案
示例 3:
- 输入:
nums = ["111","011","001"] - 输出:
"101" - 解释:
"101"不在nums中,"000"、"010"、"100"、"110"也都是合法答案
解题思路
核心观察
- 每个字符串长度是
n,可以把它看作区间[0, 2^n-1]内的一个整数。 nums里一共有n个不同字符串,只占了该区间里很少一部分值。- 只要找到一个不在集合里的整数,再转回二进制字符串即可。
算法步骤
- 把
nums中每个二进制字符串转换成十进制整数。 - 用哈希表
has记录出现过的整数。 - 从
0开始找最小的未出现整数ans。 - 将
ans还原成长度为n的二进制字符串(不足补前导0)。
这个思路和“最小缺失值”很像,代码实现简单直接。
代码实现
1 | func findDifferentBinaryString(nums []string) string { |
核心细节
- 字符串转整数:按二进制累乘,
num = num*2 + bit。 - 哈希去重:
map[int]bool查询是否出现过是O(1)平均复杂度。 - 结果补位:从末位往前填,保证结果长度固定为
n。 - 正确性关键:因为
nums只有n个元素,不可能占满[0, 2^n-1](当n>=1时2^n > n),所以一定存在缺失值。
复杂度分析
- 设
n = len(nums),每个字符串长度也是n。 - 时间复杂度:
O(n^2)- 转换阶段:
n个字符串,每个长度n - 查找缺失值:最坏会扫到
n - 回填结果:
O(n)
- 转换阶段:
- 空间复杂度:
O(n)(哈希表与结果数组)
示例分析
以 nums = ["01", "10"] 为例:
- 转换:
"01" -> 1"10" -> 2has = {1, 2}
- 找最小缺失值:
ans = 0时不在has中,停止
- 还原长度为 2 的二进制:
0 -> "00"
最终返回 "00"(同样合法)。
总结
这题本质是把“二进制字符串判重”转成“整数判重”。
如果后续想继续优化写法,也可以尝试“对角线构造法”(康托尔思想),但当前实现已经足够清晰且可通过。













