Java 二进制数组,面试问题

Java 二进制数组,面试问题,java,arrays,algorithm,binary-data,Java,Arrays,Algorithm,Binary Data,我一直在练习一些java编程问题,我在下面遇到了这个问题 给您一个包含N个元素的整数数组:d[0],d[1]。。。d[N- 1]. 您最多可以在阵列上执行一个移动:选择任意两个 整数[L,R],并在 第L位和第R位。L和R代表最左边和最右边 标记所选段边界的位的索引 决定翻身 您可以使用的最大“1”位数(由S表示)是多少 在最后一个位字符串中获取 “翻转”一位意味着将0转换为1,将1转换为1 转换为0(0->1,1->0)。在下一行输入一个整数N 包含N位,用空格分隔:d[0]d[1]。。。d

我一直在练习一些java编程问题,我在下面遇到了这个问题

给您一个包含N个元素的整数数组:d[0],d[1]。。。d[N- 1]. 您最多可以在阵列上执行一个移动:选择任意两个 整数[L,R],并在 第L位和第R位。L和R代表最左边和最右边 标记所选段边界的位的索引 决定翻身

您可以使用的最大“1”位数(由S表示)是多少 在最后一个位字符串中获取

“翻转”一位意味着将0转换为1,将1转换为1 转换为0(0->1,1->0)。在下一行输入一个整数N 包含N位,用空格分隔:d[0]d[1]。。。d[N-1]

在下面的部分中,用一个例子解释了这个问题,我无法理解这个例子的结果。这里的问题是我应该先理解这个问题,然后我可以试着解决这个问题

给出的解决方案:

输出:S

约束:1让我们从这里开始:

在下面的部分中,用一个例子解释了这个问题,我无法理解这个例子的结果。这里的问题是我应该先理解这个问题,然后我可以试着解决这个问题

您正试图在一个连续的范围内应用一个位移位操作,您的目标是最大化数组中的1的数量

查看我们的8号样本输入

1 0 0 1 0 0 1 0
我们注意到有5个0。超级总结一下我的思考过程,真正的问题是确定一个范围,即“找到一个0最多、1最少的范围”

我们查看示例输入,发现位0是1,所以我们已经排除了它。第1位和第2位是0,这迫使我们将其设置在我们的范围内。第3位是1,但接下来的两位,第4位和第5位是零,这意味着包括第3位、第4位和第5位将具有净增益。看看第6位和第7位,它们“相互抵消”,意思是包括它们或排除它们并不重要

最后,我们的范围从第1位开始,到第5位结束(包括第5位)

翻转之后,我们剩下的是

1 1 1 0 1 1 1 0
或6 1,这是示例输出

请留下任何问题。这种方法是一种“人工方法”,我们可以用如此小的输入量来实现。手工完成小样本后,编写算法以找到最佳范围需要更多步骤。

让我们从这里开始:

在下面的部分中,用一个例子解释了这个问题,我无法理解这个例子的结果。这里的问题是我应该先理解这个问题,然后我可以试着解决这个问题

您正试图在一个连续的范围内应用一个位移位操作,您的目标是最大化数组中的1的数量

查看我们的8号样本输入

1 0 0 1 0 0 1 0
我们注意到有5个0。超级总结一下我的思考过程,真正的问题是确定一个范围,即“找到一个0最多、1最少的范围”

我们查看示例输入,发现位0是1,所以我们已经排除了它。第1位和第2位是0,这迫使我们将其设置在我们的范围内。第3位是1,但接下来的两位,第4位和第5位是零,这意味着包括第3位、第4位和第5位将具有净增益。看看第6位和第7位,它们“相互抵消”,意思是包括它们或排除它们并不重要

最后,我们的范围从第1位开始,到第5位结束(包括第5位)

翻转之后,我们剩下的是

1 1 1 0 1 1 1 0
或6 1,这是示例输出


请留下任何问题。这种方法是一种“人工方法”,我们可以用如此小的输入量来实现。手工完成小样本后,编写算法以找到最佳范围将需要更多步骤。

暂时忘记数组,您有二进制数:

1 0 0 1 0 0 1 0
您的任务是查找左右索引,例如:

1 0 0 1 0 0 1 0
  ^       ^
  left    right
当您反转左/右之间的每一位并计算最终数字/数组中的一(1)个数时,找到最大数为1的左/右索引的组合

在这个特殊的例子中,如果我们取左1,右5,最终的数组将是

0 1 2 3 4 5 6 7 (indexes)
1 0 0 1 0 0 1 0 (original array)
1 1 1 0 1 1 1 0 (I've inverted, 1st, 2nd, 3rd, 4th, 5th)
现在,我们如何计算它。第一种方法通常是蛮力,尝试所有可能的左/右组合并找到最大值:

public static void main(final String s[]) {
    final int[] d = {1, 0, 0, 1, 0, 0, 1, 0};
    int max = getOnes(d);
    for (int left = 0; left < (d.length - 1); left++) {
        for (int right = (left + 1); right < d.length; right++) {
            invert(d, left, right); // flip bits
            max = Math.max(max, getOnes(d));
            invert(d, left, right); // reverse flipping
        }
    }
    System.out.println(max);
}

static int getOnes(final int[] d) {
    int cnt = 0;
    for (final int i : d) cnt += i;
    return cnt;
}

static void invert(final int[] d, final int left, final int right) {
    for (int i = left; i <= right; i++) d[i] = (1 - d[i]);
}
publicstaticvoidmain(最终字符串s[]){
final int[]d={1,0,0,1,0,0,1,0};
int max=getOnes(d);
对于(int left=0;left<(d.length-1);left++){
for(int right=(left+1);right对于(int i=left;i暂时忘记数组,您有二进制数:

1 0 0 1 0 0 1 0
您的任务是查找左右索引,例如:

1 0 0 1 0 0 1 0
  ^       ^
  left    right
当您反转左/右之间的每一位并计算最终数字/数组中的一(1)个数时,找到最大数为1的左/右索引的组合

在这个特殊的例子中,如果我们取左1,右5,最终的数组将是

0 1 2 3 4 5 6 7 (indexes)
1 0 0 1 0 0 1 0 (original array)
1 1 1 0 1 1 1 0 (I've inverted, 1st, 2nd, 3rd, 4th, 5th)
现在,我们如何计算它。第一种方法通常是蛮力,尝试所有可能的左/右组合并找到最大值:

public static void main(final String s[]) {
    final int[] d = {1, 0, 0, 1, 0, 0, 1, 0};
    int max = getOnes(d);
    for (int left = 0; left < (d.length - 1); left++) {
        for (int right = (left + 1); right < d.length; right++) {
            invert(d, left, right); // flip bits
            max = Math.max(max, getOnes(d));
            invert(d, left, right); // reverse flipping
        }
    }
    System.out.println(max);
}

static int getOnes(final int[] d) {
    int cnt = 0;
    for (final int i : d) cnt += i;
    return cnt;
}

static void invert(final int[] d, final int left, final int right) {
    for (int i = left; i <= right; i++) d[i] = (1 - d[i]);
}
publicstaticvoidmain(最终字符串s[]){
final int[]d={1,0,0,1,0,0,1,0};
int max=getOnes(d);
对于(int left=0;left<(d.len