在由重复的反转和追加操作创建的二进制字符串查找第 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