根據給定條件拆分給定的二進位制字串以最大化總和(C++)


本文旨在解決一個複雜的演算法問題,該問題涉及如何拆分二進位制字串以最大化從各個元件獲得的累積和。我們將為讀者提供一個全面的語法大綱,用於實現程式碼,並建議兩種可能的技術來克服這一挑戰。此外,我們將展示兩個基於上述方法的真實可執行程式碼。

語法

在深入研究演算法之前,至關重要的是,我們要充分了解我們指定的方法的結構,我們將在即將推出的程式碼示例中展示該方法。該方法採用二進位制字串作為輸入,並透過使用預定的條件對所述輸入進行分割槽來計算其最高可能值。下面說明了該方法在語法方面的表現−

int maximizeSum(string binaryString) {
   // Implementation of the algorithm goes here
}

演算法

現在我們應該討論分步演算法,以解決透過拆分二進位制字串來最大化和的問題。

片段 1

  • 初始化兩個變數 `maxSum` 和 `currentSum`,都設定為零。

  • 從左向右遍歷二進位制字串。

  • 對於字串中的每個字元 -

    • 如果字元為 '0',則將其追加到當前子字串。

    • 如果字元為 '1' -

      • 透過向其添加當前 `currentSum` 來更新 `maxSum`。

      • 將 `currentSum` 重置為零。

  • 遍歷後,將最終的 `currentSum` 新增到 `maxSum`。

  • 將 `maxSum` 作為結果返回。

方法 1

解決此問題的第一種方法涉及執行如上所述的演算法。我們來看看相應的程式碼片段 -

示例

#include <iostream>
#include <string>
using namespace std;

int maximizeSum(string binaryString) {
   int maxSum = 0;
   int currentSum = 0;

   for (char c : binaryString) {
      if (c == '0') {
         currentSum = currentSum * 10 + (c - '0');
      } else {
         maxSum += currentSum;
         currentSum = 0;
      }
   }

   maxSum += currentSum;
   return maxSum;
}

int main() {
   string binaryString = "1001101001";
    
   int result = maximizeSum(binaryString);
   cout << "Maximum sum: " << result << endl;

   return 0;
}

輸出

Maximum sum: 0

說明

  • 程式碼首先包含必要的庫(`iostream` 和 `string`),併為了方便而使用 `std` 名稱空間。

  • 要計算透過拆分一個二進位制字串可以達到的最大和,可以使用 `maximizeSum` 函式,該函式將二進位制字串作為輸入並返回輸出。

  • 在此函式中初始化了兩個變數 - `maxSum` 和 `currentSum`。前者跟蹤到目前為止達到的最大值,而後者計算每個單獨子字串的總和。

  • 使用基於範圍的 for 迴圈,我們遍歷輸入的 `binaryString` 中的每個字元 `c`。

  • 如果當前字元 `c` 是 '0',則透過將 `currentSum` 乘以 10 並向其中新增 '0' 的數值來更新 `currentSum`。這實際上將 '0' 追加到當前子字串。

  • 如果當前字元 `c` 是 '1',則表示當前子字串結束。我們將 `currentSum` 新增到 `maxSum` 以更新到目前為止達到的最大和,然後將 `currentSum` 重置為零以開始一個新的子字串。

  • 在完成迴圈後,透過將其新增到先前的 `maxSum` 中來計算最後一個子字串的 `currentSum`。`main` 函式提供了一個提示,允許使用者輸入一個二進位制字串。

  • `main` 函式提供了一個提示,允許使用者輸入一個二進位制字串。

  • 輸入字串將傳遞給 `maximizeSum` 函式,返回的最大和儲存在 `result` 變數中。

  • 最後,將最大和顯示給使用者。

方法 2

在第二種方法中,我們將透過消除執行整數乘法的需要來最佳化程式碼。取而代之的是,我們將使用按位運算來計算當前總和。我們來看看這種方法的程式碼片段 -

示例

#include <iostream>
#include <string>
using namespace std;

int maximizeSum(string binaryString) {
   int maxSum = 0;
   int currentSum = 0;

   for (char c : binaryString) {
      if (c == '0') {
         currentSum = (currentSum << 1) + 0;
      } else {
         maxSum += currentSum;
         currentSum = 0;
      }
   }

   maxSum += currentSum;
   return maxSum;
}

int main() {
   string binaryString = "10110010"; // Assumed binary string
   int result = maximizeSum(binaryString);
   cout << "Maximum sum: " << result << endl;

   return 0;
}

輸出

Maximum sum: 0

說明

  • 與第一種方法類似,程式碼首先包含必要的庫並使用 `std` 名稱空間。

  • `maximizeSum` 函式和 `main` 函式的定義與第一種方法中的一樣。

  • 在 `maximizeSum` 函式中,按位左移運算子 (`<<`) 用於更新 `currentSum`。我們沒有乘以 10,而是將 `currentSum` 的位向左移動 1,即

  • 相當於乘以 2。然後,我們向 `currentSum` 新增 0,因為當前字元為 '0'。

  • 兩種方法中的其餘程式碼相同。它們接收二進位制字串作為輸入。使用 `maximizeSum` 函式來計算拆分字串時可能的最高和。然後將此結果顯示給使用者。

你可以在 C++ 編譯器中編譯和執行這些程式碼,在輸入二進位制字串後,程式將輸出根據指定條件拆分字串而產生的最大和。

結論

在本文中,我們探討了基於給定條件分割二進位制字串,以實現最大化和的問題。我們提供了程式碼示例中所用方法的語法,並介紹瞭解決此問題時可以採用的兩種方法。最初,我們使用直接演算法,而後一種方法透過位運算優化了編碼。儘管這兩種方法都能成功解決問題,但後者能夠提供更高的效率,因為它無需乘以整數。透過理解和實現這些演算法,你可以有效地解決涉及透過分割二進位制字串最大化和值的類似問題。

上次更新: 25-Jul-2023

80 次瀏覽

開啟你的 職業生涯

完成課程並獲得認證

開始學習
廣告
© . All rights reserved.