1545. 找到第 N 个二进制字符串中的第 K 位

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

给定正整数 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 来找到对应位置。

🏷️

标签

➡️

继续阅读