修改一個二進位制字串,透過翻轉字元使包含 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 次瀏覽

開啟你的 職業生涯

完成課程獲得認證

立即開始
廣告