C++ 根据给定条件将给定的二进制字符串拆分,并最大化总和
本文旨在解决一个复杂的算法问题,涉及将二进制字符串拆分成多个部分,以最大化其各个组成部分的累积和。我们将为读者提供一个全面的语法大纲来实现代码,并提出两种可能的技术来克服这个挑战。此外,我们将展示两个基于上述方法的真实可执行代码。
语法
在深入研究算法之前,我们必须熟悉我们指定的方法的结构,我们将通过即将展示的代码示例来展示此方法。该方法使用一个二进制字符串作为输入,并使用预定条件对其进行分区以计算其最大可能值。下面以语法形式说明了这种方法的外观 −
int maximizeSum(string binaryString) {
// Implementation of the algorithm goes here
}
步骤
现在我们应该讨论一下解决通过拆分二进制字符串来最大化求和问题的逐步算法。
片段1
- 初始化两个变量
maxSum和currentSum,都设置为0。 -
从左到右遍历二进制字符串。
-
对于字符串中的每个字符 –
- 如果字符是’0’,将其添加到当前子字符串中。
-
如果字符是’1′ –
- 通过将当前
currentSum添加到maxSum中来更新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。前者追踪到目前为止所达到的最大值,而后者计算每个单独子字符串的和。 -
使用一个基于范围的循环遍历输入的二进制字符串中的每个字符
c。 -
如果当前字符
c是’0’,我们通过将其乘以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。然后我们将0加到currentSum中,因为当前字符是’0’。 -
两种方法中其余的代码是相同的。它们接收一个二进制字符串作为输入。使用
maximizeSum函数来计算在按照指定条件分割字符串时的最大可能和。然后将此结果呈现给用户。
您可以在C++编译器中编译和运行这些代码,并在输入一个二进制字符串后,程序将输出通过按照指定条件分割字符串获得的最大和。
结论
在本文中,我们探讨了根据给定条件分割二进制字符串以最大化和的问题。我们提供了代码示例中使用的方法的语法,并提出了两种解决该问题的方法。最初,采用了直接的算法,而随后的技术通过位运算优化了编码。尽管这两种方法都能成功解决问题,但后一种方法更加高效,因为它消除了对整数乘法的任何需求。通过理解和实现这些算法,您可以有效地解决涉及通过分割二进制字符串最大化和的类似问题。
极客笔记