区间子数组个数 增减字符串匹配 不含 AAA 或 BBB 的字符串

管理员

795. 区间子数组个数

思路,最大值小于等于r的子区间的数目,减去最大值小于l的子区间的数目
public int numSubarrayBoundedMax(int[] nums, int left, int right) {
return dnn(nums, right) - dnn(nums, left - 1);
}
public int dnn(int[] nums, int max) {
int ans = 0;
int cur = 0;
for(int i : nums) {
if(i <= max) {
cur++;
ans += cur;
}else {
cur = 0;子区间得连续
}
}
return ans;
}


942. 增减字符串匹配

int l = 0, r = s.length(), n = s.length();左右开弓
int[] ans = new int[n + 1];
for(int i = 0; i < n; i++) {
ans[i] = s.charAt(i) == 'I' ? l++ : r--;左小于右,此位置直接填此时最小值;左大于右,直接填此时最大值
}
ans[n] = l;天上最后一个元素,此时l==r
return ans;


984. 不含 AAA 或 BBB 的字符串

StringBuilder ans = new StringBuilder();
while(a > 0 || b > 0) {
int l = ans.length();
boolean writeA = false;
if(l >= 2 && ans.charAt(l - 1) == ans.charAt(l - 2)) {已经连续两个了,下一个必须不一样
if(ans.charAt(l - 1) == 'b') {看看连续的是谁
writeA = true;
}
}else {
if(a > b) {则看看谁剩的多,优先填
writeA = true;
}
}
if(writeA) {
a--;
ans.append('a');
}else {
b--;
ans.append('b');
}
}
return ans.toString();