📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|第 59 题(1)

📅  最后修改于: 2023-12-03 14:58:33.899000             🧑  作者: Mango

Sudo GATE 2020 Mock II(2019 年 1 月 10 日)第 59 题介绍

在这道题目中,我们需要使用两个整数 NK,和一个二进制数组 bits,来找到一个恰好为 K 位 1 的 N 位二进制数,并且在任何相邻的 两个 1 之间有一个 0。

在这个问题中,我们可以使用一个非常简单的解决方案来得到所需的二进制数。

我们可以首先处理两个特殊的情况——当 K 为 0 或 1 时,我们可以直接将其作为输出返回,此时数组 bits 中的任何元素都不重要。

否则,如果 bits 中的第一个元素为 1,则我们需要在输出的二进制数字的第一位上添加 0。同样的,如果 bits 中最后一个元素为 1,则在输出的二进制数的最后一位上添加 0。

这是因为,按照题意,在任何相邻的 两个 1 之间必须有一个 0,而在上述特殊情况下,我们已经打破了相邻两个 1,所以需要在第一位或最后一位上添加一个 0。

接下来,我们仅需将剩余的 K-2 位 1 插入到二进制中的空隙中即可。因为有了问题中的性质——相邻两个 1 之间必须有一个 0,我们,所以我们可以将 K-2 个 1 均匀地插入到 N-2 个空隙中即可。

需要注意的一点是,当 K-2 不能完全均匀地插入到 N-2 个空隙中时,我们需要在最后一个 1 之前的所有空隙中插入一个 1。

接下来是 Python 代码实现:

class Solution:
    def kthGrammar(self, N: int, K: int, bits: List[int]) -> int:
        if K == 1:
            return 0
        if K == 2:
            return 1
        if bits[0] == 1:
            K -= 1
        if bits[-1] == 1:
            K -= 1
        return bin(K - 1)[2:].count('1') % 2

这里,我们用了一个少数派真言——二进制中 1 的数量比特数模 2 后的结果相同,来计算返回的值。

所以,我们只需要计算插入后还剩下的 1 的个数,对 2 取模,就是所需的 0/1 值了。