无论我如何努力,我都无法理解这段代码为何有效,更不用说我无法想象如何得出这样的解决方案。我无法从根本上理解所有操作之间的联系,为什么如果索引 i 的元素等于(例如零),那么从单元数数组到每个位置我们采用索引 i - 1 的元素,并乘以最后一个元素与索引为i的元素的差,其中这个公式有什么逻辑吗?我已经在心里用不同的台词重复了好几次这个循环,但我根本无法从这个词中理解任何逻辑。如果有任何解释,我将非常感激。
public long NumberOfWays(string s) {
int n = s.Length;
int[] count0 = new int[n];
int[] count1 = new int[n];
long totalWays = 0;
for (int i = 0; i < n; i++) {
if (i > 0) {
count0[i] = count0[i - 1];
count1[i] = count1[i - 1];
}
if (s[i] == '0') {
count0[i]++;
} else {
count1[i]++;
}
}
for (int j = 1; j < n - 1; j++) {
if (s[j] == '0') {
totalWays += count1[j - 1] * (count1[n - 1] - count1[j]);
} else {
totalWays += count0[j - 1] * (count0[n - 1] - count0[j]);
}
}
return totalWays;
}
}
任务本身:给你一个 0 索引的二进制字符串 s,它代表街道上建筑物的类型,其中:
s[i] = '0' 表示第 i 栋大楼是办公室,s[i] = '1' 表示第 i 栋大楼是餐厅。作为一名城市官员,您希望选择 3 座建筑物进行随机检查。然而,为了确保多样性,所选择的建筑物中不能有两个连续的建筑物是同一类型的。
例如,给定 s =“001101”,我们无法选择第 1、第 3 和第 5 栋建筑物,因为这将形成“011”,这是不允许的,因为有两个相同类型的连续建筑物。返回选择 3 座建筑物的有效方式的数量。