修改一个二进制字符串,通过翻转字符使包含 1 的任何一对索引既非互质数也不是彼此可整除


在这个问题中,提供了一个长度为 4*N 的二进制字符串,我们需要翻转二进制字符串的零,以便由“1”组成的索引对既不能互质也不能彼此可整除。

这里,我们可以通过观察来解决问题。该字符串包含 4*N 个字符。我们可以翻转最后面 N 个位于偶数索引处的字符。

问题陈述 – 给定一个整数 N 和一个长度为 4*N 的二进制字符串,该字符串最初包含所有零。我们需要以这样的方式将“0”翻转为“1”,使由“1”组成的索引对在结果字符串中彼此不能整除且互质。另外,给定索引从 1 开始。

注意 – 互质数是没有共同因子(除了 1)的数。

示例

输入 – str = ‘000000000000’ K = 3

输出 – ‘000000010101’

解释 – 我们翻转了 {8, 10, 12} 索引处的字符,因为任何一对都不彼此可整除。此外,任何一对都不是互质数,因为它们都有 2 作为共同因子。

输入 – str = ‘00000000’ K = 2

输出 – ‘00000101’

解释– 我们将 {6, 8} 索引处的字符翻转,因为它们不能彼此整除,也不是互素数。

输入– str = ‘0000’ K = 1

输出– ‘0001’

解释– 我们将 {4} 索引处的字符翻转。

方法 1

在此方法中,我们将翻转最后 N 个位于偶数位置的字符,以便根据给定条件获得结果字符串。

例如,K = 3,初始二进制字符串将为‘000000000000’。当我们从最后翻转偶数索引处的 3 个字符时,字符串将变为 000000010101,索引值分别为 {8, 10, 12}。如果我们翻转第 7 索引处的字符,则 7 和所有其他字符互素。如果我们翻转第 6 索引处的字符,则 12 能被 6 整除。因此,我们只能翻转最后 N 个位于偶数索引处的字符。

算法

  • 将‘len’变量的值初始化为 4*N。

  • 使用 for 循环执行 N 次迭代。

  • 翻转 len -1 索引处的字符,因为字符串索引从 0 开始。

  • 将‘len’的值减 2,因为我们只需要翻转偶数索引处的字符。

  • 最后,返回更新后的字符串。

示例

#include <iostream>
using namespace std;
// function to modify the string str by flipping 0 to 1 at particular indices so that any 2 indices are not co-prime of each other and divisible by each other
string getstring(char str[], int N) {
   int len = 4 * N;
   // flip total N 0's to 1's at 4N, 4N-2, 4N-4, 4N-6, ... indices
   for (int i = 1; i <= N; i++) {
      str[len - 1] = '1';
      len -= 2;
   }
   return str;
}
int main() {
   int N = 4;
   char str[N * 4];
   // Initialize the string str
   for (int i = 0; i < 4 * N; i++)
      str[i] = '0';
   cout << "The string after modifying is " << getstring(str, N);
   return 0;
}

输出

The string after modifying is 0000000001010101�SK-�

时间复杂度 – O(N),因为我们执行了 N 次迭代。

空间复杂度 – O(1),因为我们在没有使用额外空间的情况下更新了给定的字符串。

我们只是基于观察解决了上述问题。有时,观察不同的输入和输出比使用数学运算的逻辑更重要。

更新于: 2023 年 8 月 18 日

106 次浏览

开启你的 职业生涯

完成课程获得认证

立即开始
广告