Java 二进制数组,面试问题
我一直在练习一些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号样本输入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
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