1545. 找到第 N 个二进制字符串中的第 K 位
内容提要
给定正整数 n 和 k,生成二进制字符串 Sn:S1 = '0',Si = Si-1 + '1' + reverse(invert(Si-1))。目标是找到 Sn 的第 k 位。通过递归方法,若 k 在前半部分,递归查找;若在中间,返回 '1';若在后半部分,映射到前半部分并翻转结果。时间和空间复杂度均为 O(n)。
关键要点
-
给定正整数 n 和 k,生成二进制字符串 Sn。
-
S1 = '0',Si = Si-1 + '1' + reverse(invert(Si-1))。
-
目标是找到 Sn 的第 k 位。
-
通过递归方法查找 k 位:如果 k 在前半部分,递归查找;如果在中间,返回 '1';如果在后半部分,映射到前半部分并翻转结果。
-
Si 的长度为 2^i - 1,且中间位总是 '1'。
-
时间和空间复杂度均为 O(n)。
-
递归步骤包括计算中间索引,如果 k 小于中间索引,则在前半部分查找;如果 k 大于中间索引,则在反转的后半部分查找并翻转结果。
-
通过递归和字符串构造的性质,避免生成整个字符串,提高效率。
延伸解读
递归方法的优势
通过递归方法查找第 k 位,避免了生成整个二进制字符串的开销。这种方法在处理较大的 n 值时尤为有效,因为字符串的长度会迅速增长。利用递归可以在 O(n) 的时间复杂度内找到结果,节省了时间和空间资源。
字符串构造的特点
每个字符串 Sn 的构造遵循特定的模式:前半部分是 Si-1,后半部分是 Si-1 的反转和位翻转。这种结构使得中间位总是 '1',并且可以通过简单的映射和翻转来快速定位 k 位,增强了算法的灵活性和效率。
注意递归边界条件
在使用递归查找时,需特别注意边界条件。当 n = 1 时,字符串唯一为 '0',此时无论 k 的值如何,结果均为 '0'。确保在递归过程中正确处理这些边界情况,以避免不必要的错误。
延伸问答
如何生成二进制字符串 Sn?
二进制字符串 Sn 的生成规则为 S1 = '0',Si = Si-1 + '1' + reverse(invert(Si-1))。
如何找到 Sn 的第 k 位?
通过递归方法查找,如果 k 在前半部分,递归查找;如果在中间,返回 '1';如果在后半部分,映射到前半部分并翻转结果。
Si 的长度是多少?
Si 的长度为 2^i - 1。
时间和空间复杂度是多少?
时间和空间复杂度均为 O(n)。
中间位总是是什么?
中间位总是 '1'。
如何处理 k 在后半部分的情况?
如果 k 在后半部分,映射到前半部分并翻转结果,使用 k' = 2^i - k 来找到对应位置。