思路
统计两段相邻的非活跃(连续0)区段,转为活跃区段即可。如果不足两段记为0。
本来挺简单一题。。我一开始脑补了 连续 二字,给做麻烦了,而且给出的示例测起来也没问题!!!(甚至提交的时候过了105个用例)
错误代码如下
class Solution {
public int maxActiveSectionsAfterTrade(String s) {
char last = '1';
int cnt1l = 0, cnt0l = 0, cnt1m = 0, cnt0r = 0, cnt1r = 0;
int cnt = 0;
int ans = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (c == last) {
cnt++;
continue;
}
if (c == '1') {
if (cnt0l == 0) {
cnt0l = cnt;
} else {
cnt0r = cnt0l;
cnt0l = cnt;
}
} else {
if (cnt1l == 0) {
cnt1l = cnt;
} else if (cnt1m == 0) {
cnt1m = cnt1l;
cnt1l = cnt;
} else {
cnt1r = cnt1m;
cnt1m = cnt1l;
cnt1l = cnt;
ans = Math.max(ans, cnt1l + cnt0l + cnt1m + cnt0r + cnt1r);
}
}
cnt = 1;
last = c;
}
if (last == '1') {
if (cnt1l == 0) {
ans = cnt;
} else if (cnt1m == 0) {
ans = Math.max(cnt1l, cnt);
} else {
ans = Math.max(ans, cnt1l + cnt0l + cnt1m + cnt0r + cnt);
}
} else {
if (cnt0l == 0) {
ans = cnt1l;
} else {
ans = Math.max(ans, cnt1l + cnt0l + cnt1m + cnt);
}
}
return ans;
}
}
代码
class Solution {
public int maxActiveSectionsAfterTrade(String s) {
char last = '1';
int cnt0l = 0, cnt0r = 0, cnt1 = 0;
int cnt = 0, max = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (c == '1') {
cnt1++;
}
if (c == last) {
cnt++;
continue;
}
if (c == '1') {
if (cnt0l != 0) {
cnt0r = cnt0l;
cnt0l = cnt;
max = Math.max(max, cnt0r + cnt0l);
} else {
cnt0l = cnt;
}
}
cnt = 1;
last = c;
}
if (last == '0') {
if (cnt0l != 0) {
max = Math.max(max, cnt + cnt0l);
}
}
return cnt1 + max;
}
}