📜  在由重复的反转和追加操作创建的二进制字符串查找第 k 位

📅  最后修改于: 2022-05-13 01:57:14.606000             🧑  作者: Mango

在由重复的反转和追加操作创建的二进制字符串查找第 k 位

您将获得一个以“0”开头的初始字符串s 。字符串不断重复如下。它的反转附加到它。
例子:

Input :  k = 2
Output : 1
Initially s = "0". 
First Iteration  : s = s + s' = "01"
Second Iteration : s = s + s' = "0110"
The digit at index 2 of s is 1.

Input :  k = 12
Output : 0

1. 天真的方法
我们可以按照问题描述中提到的方式构建长度小于或等于 i 的字符串s,然后简单地在字符串s 中查找所需的索引。

C++
// C++ program to find k-th bit in a string
// formed by repeated invert and append
// operations.
#include 
using namespace std;
 
int printIndexVal(int k, string s)
{
    while (s.length() <= k) {
 
        // Building the complement of s
        string t = "";
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '0')
               t += '1';
             else
               t += '0';
        }
 
        // Appending the complement to form
        // the new string
        s += t;
    }
 
    // To match return type
    return s[k] - '0';
}
 
// Driver program to test above function
int main()
{
    string s = "0";
    int k = 7;
    cout << printIndexVal(k, s) << endl;
    return 0;
}


Java
// Java program to find k-th bit in a string
// formed by repeated invert and append
// operations.
class GFG
{
 
static int printIndexVal(int k, String s)
{
    while (s.length() <= k)
    {
 
        // Building the complement of s
        String t = "";
        for (int i = 0; i < s.length(); i++)
        {
            if (s.charAt(i) == '0')
                t += '1';
            else
                t += '0';
        }
 
        // Appending the complement to form
        // the new string
        s += t;
    }
 
    // To match return type
    return s.charAt(k) - '0';
}
 
// Driver code
public static void main(String[] args)
{
    String s = "0";
    int k = 7;
    System.out.println(printIndexVal(k, s));
}
}
 
// This code is contributed by 29AjayKumar


C#
// C# program to find k-th bit in a string
// formed by repeated invert and append
// operations.
using System;
 
class GFG
{
 
static int printIndexVal(int k, String s)
{
    while (s.Length <= k)
    {
 
        // Building the complement of s
        String t = "";
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] == '0')
                t += '1';
            else
                t += '0';
        }
 
        // Appending the complement to form
        // the new string
        s += t;
    }
 
    // To match return type
    return s[k] - '0';
}
 
// Driver code
public static void Main(String[] args)
{
    String s = "0";
    int k = 7;
    Console.WriteLine(printIndexVal(k, s));
}
}
 
// This code contributed by Rajput-Ji


Javascript


CPP
// C++ program to find k-th bit in a string
// formed by repeated invert and append
// operations.
#include 
using namespace std;
 
int printIndexVal(int k)
{
    // Variable to store set bits
    unsigned long long int c = 0;
 
    // Count set bits in a binary number
    while (k > 0) {
        k &= (k - 1);
        c++;
    }
 
    // Return 1 if number of set bits
    // is odd.
    return c & 1;
}
 
// Driver Function
int main()
{
    int k = 12;
    cout << printIndexVal(k) << endl;
}


输出:

1

时间复杂度: O(k log k)。
更好的方法:
让我们来看看几个字符串结构:
1. 秒 = 0
2. 秒 = 01
3. 秒 = 0 1 10
4. s = 011 0 1001
5. 秒 = 01101001100 1 0110
让我们考虑在第 5 行中找到位置 11 处的位。该位置的位值实际上是第 4 行中索引 3 处的位的补码。因此我们实际上需要找到索引 3 处的位的补码
s[11] = ~(s[3])。然而我们也不知道 s[3]。让我们继续前进。现在 s[3] = ~(s[1]) 使用第 3 行中相同的解释。并且 s[1] = ~(s[0])。但是,问题陈述中的 s[0] 始终为 0。
插入这些结果,
s[11] = ~(~(~0)) = 1其中 '~' 是按位非运算符。
现在,k 最初是 11,也就是二进制的 1011。 k 的下一个值是 3,即 011。请注意第一个设置位如何从原始 k 减少的。随后,k 的下一个值是 1。另一个设置位减少了。最后对于 k = 0,最后一个设置位已经消失。因此,对于 k = 11,即二进制 1011,补码数为 3,这恰好等于 11 中设置的位数。现在我们看到对于奇数次求逆,最终结果为 1。我们可以得出相同的对偶数次反转的推理产生最终结果为 0。
要计算整数中设置位的数量,请参阅这篇文章 – 计算整数中的设置位。

CPP

// C++ program to find k-th bit in a string
// formed by repeated invert and append
// operations.
#include 
using namespace std;
 
int printIndexVal(int k)
{
    // Variable to store set bits
    unsigned long long int c = 0;
 
    // Count set bits in a binary number
    while (k > 0) {
        k &= (k - 1);
        c++;
    }
 
    // Return 1 if number of set bits
    // is odd.
    return c & 1;
}
 
// Driver Function
int main()
{
    int k = 12;
    cout << printIndexVal(k) << endl;
}

输出:

0