我遇到了一个关于在二进制序列中识别重复项的相当常见的实践问题(通常称为“硬币翻转”问题),并且似乎很难解释它,所以请耐心等待。我需要交替二进制序列中的最小更改次数,同时返回这可能导致的最大不同输出。
示例:给定一个数组 A = [1, 0, 1, 0, 1, 1],可以进行最小更改以使序列交替,使其 A = [1, 0, 1, 0, 1, 0],因此更改 = 1。没有其他方法可以进行 1 更改并保持交替序列。
我的问题是我必须找到可以做出的结果的数量。因此,给定数组 A = [0, 1, 1, 0] 可以产生两个最大结果。[1, 0, 1, 0] 或 [0, 1, 0, 1] 都只需要更改 = 2。这可能只是我无法弄清楚正确的逻辑,请参见下面的代码:
public class Solution {
public int Solution(int[] S) {
int changes = 0;
for (int i = 0; i < S.length - 1; i++) { //using length - 1 so my if statement doesn't go out of bounds
if (S[i] == S[i + 1]) {//How I'm detecting if a duplication has occured (and why length - 1 is necessary)
changes++;
}
if ((S.length >= 4 && i >= 1) && (S[i - 1] == S[i + 2] && S[i] == S[i + 1])) {//This is where I'm having logic issues. It really only addresses the specific instance listed above
changes++;
}
}
return changes;
}
}
当找到最小数量的可能变化时,这很好用,但不是结果。这可能只是一个我无法思考的逻辑问题。我见过其他人问过基本相同的问题,但从未试图找到这个神话般的“最大结果”。如果该解决方案存在于不同的线程中,请将其发送给我。非常感谢!
*似乎我做了一个糟糕的例子来解释我所说的最大结果的意思,我做了一个更好的例子:
使用数组 A = [1, 1, 1, 1, 1, 1] 您应该返回 3,从而导致 [1, 0, 1, 0, 1, 0] 用于更改值 1、3 和 5。这是与以 [0, 1, 0, 1, 0, 1] 结尾的更改数量相同。您需要至少更改 3 个值才能生成交替序列,但只有三个更改可能会产生第二个结果。