【问题标题】:Java MAXIMUM outcomes, while maintaining minimum changes in an alternating binary sequence (coin flip) questionJava MAXIMUM 结果,同时保持交替二进制序列(硬币翻转)问题的最小变化
【发布时间】:2021-05-06 04:46:25
【问题描述】:

我遇到了一个关于识别二进制序列中的重复项的相当常见的实践问题(通常称为“硬币翻转”问题),并且似乎难以解释它,所以请耐心等待。我需要交替二进制序列中的最小更改次数,同时返回这可能导致的最大不同输出。

示例:给定一个数组 A = [1, 0, 1, 0, 1, 1] 可以进行最小更改以使序列交替,使其 A = [1, 0, 1, 0 , 1, 0],因此 changes = 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 个值才能生成交替序列,但只有三个更改可能会产生第二种结果。

【问题讨论】:

    标签: java binary max sequence alternating


    【解决方案1】:

    对于给定数量的硬币,只有两种可能的交替序列:一种以0 开头,另一种以1 开头。
    假设一枚硬币只能翻转一次1,则只能进行两组可能的更改。一个导致第一个序列,另一个导致第二个解决方案。两组变化是互补的,所以两者变化的总和一定是硬币的数量。


    示例 3 个硬币

    可能的顺序:

    • 0, 1, 0
    • 1, 0, 1

    0, 1, 1开始,我们可以翻转:

    • 第三枚硬币并获得第一个序列
    • 将第一个和第二个硬币翻转以获得第二个序列。

    第二个解决方案 - 抛硬币 12 - 是第一个解决方案 () - 只抛硬币 3。第一个有1零钱,第二个2 - sum是3,硬币的数量。

    结论:如果你找到最小的变化次数,最大值一定是inverse,即翻转所有其他硬币。找零的数量就是硬币的数量和最小找零的数量之差。


    示例 6 个硬币

    可能的顺序:

    • 0, 1, 0, 1, 0, 1
    • 1, 0, 1, 0, 1, 0

    1, 0, 1, 0, 1, 1(你的例子)开始,我们可以翻转:

    • 币号6:1, 0, 1, 0, 1, 0-计数1
    • 除了数字60, 1, 0, 1, 0, 1 - 计数5

    总和:1 + 5 = 6,硬币数量


    1 否则我们将有无限可能的移动 - 掷硬币两次(四、六、...次)会产生相同的结果

    【讨论】:

    • 这是一个写得很好的答案,尽管是一个不同的问题。看来我需要澄清一下。我需要最大可能的结果,在您的示例中,答案是 2。是的,将有 3 个最大序列更改,但只有 2 个不同的结果。我会更新我的问题,希望能澄清这一点。
    • 我认为我的问题措辞不当。我需要最小的改变来获得最大的不同结果。 [1, 1, 0, 1, 1] 返回 2,因为您可以更改条目 0 和条目 4 以获得 [0, 1, 0, 1, 0]。或 [1, 0, 1, 0, 1]。两者都是正确的,但都不需要超过 2 次更改。
    • 根据给定的预期结果是 1。将索引 5 处的条目更改为 0。这种情况下的结果是您可以使用相同数量的更改进行不同的序列。
    • 我很可能误解了提示,因为我阅读和尝试的越多,它似乎在搜索某种最大值和最小值。最好删除此线程。我认为系统中的某个地方只是一个“陷阱”。
    猜你喜欢
    • 2021-08-09
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多