一、题目
二、解题思路
1、从左到右遍历,遇见1计数+1,遇见0放进数组,遇见2阻断清零重新计数(相当于计算出每个0左边连续1的个数)
2、从右到左遍历,遇见1计数+1,遇见0放进数组,遇见2阻断清零重新计数(相当于计算出每个0右边连续1的个数)
3、由于两次遍历方向相反,所以累加时是首尾相加
用到的方法:
切割字符串放进数组、正向/逆向遍历数组
三、代码
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
// 从空格处切割字符串,转成整型后放进数组
vector<int> split(string params) {
vector<int>p;
while (params.find(" ") != string::npos) {
int found = params.find(" ");
p.push_back(stoi(params.substr(0, found)));
params = params.substr(found + 1);
}
p.push_back(stoi(params));
return p;
}
int main() {
string input_str;
getline(cin, input_str);
vector<int>input = split(input_str);
vector<int>left;
int left_sum = 0;
for (int i = 0; i < input.size(); i++) { // 从左到右遍历
if (input[i] == 1) {
left_sum++; // 遇到1计数
}
else if (input[i] == 0) { // 遇到0将已有的计数放进数组,然后计数清零
left.push_back(left_sum);
left_sum = 0;
}
else { // 遇到2阻断,直接清零
left_sum = 0;
}
}
vector<int>right;
int right_sum = 0;
for (int i = input.size() - 1; i >= 0; i--) { // 从右到左遍历
if (input[i] == 1) { // 遇到1计数
right_sum++;
}
else if (input[i] == 0) { // 遇到0将已有的计数放进数组,然后计数清零
right.push_back(right_sum);
right_sum = 0;
}
else { // 遇到2阻断,直接清零
right_sum = 0;
}
}
vector<int>res;
for (int i = 0; i < left.size(); i++) {
res.push_back(left[i] + right[right.size() - 1 - i]); // 两个数组收尾值相加
}
sort(res.begin(), res.end()); // 数组升序排列
cout << res[res.size() - 1]; // 输出最后一个元素
return 0;
}