我正在研究一个黑客问题:
问题是在数组中找到包含范围[L,R],使得当范围按降序排序时,对排序范围中的前2个元素执行AND运算会导致所有这些可能的最大值结果。该函数必须返回一个2个整数的数组,其中索引0包含一个对应于数组中L'索引的整数,索引1包含一个对应于数组中R的索引的整数。
如果有超过1个有效答案,请选择L值最低的答案;如果2个或更多有效答案具有相同的L值,请选择跨越最短范围的答案。
示例array = {6,3,6}
输出应为0.2
说明:对于范围[0,2],当排序变为{6,6,3}时变为{6,6,3}。然后AND操作6和6将产生最大可能的答案。因此结果应为[0,2]。
我已经尝试过这个问题并附上以下答案:
static int[] process(int[] array) {
int max=0;
List<Integer[]> list = new ArrayList<>();
Integer[] index = new Integer[2];
for (int i = 0; i < array.length; i++) {
for(int j =i+1 ; j <= array.length -1 ; j++){
int z = array[i] & array[j];
if(z > max){
max=z;
index[0] = i;
index[1] = j;
list.add(index);
}
}
}
int[] result = new int[2];
result[0] = index[0];
result[1] = index[1];
int least = result[0] - result[1];
for(int i=1; i< list.size(); i++) {
Integer[] data = list.get(i);
int temp = index[0] - index[1];
if(temp < least) {
least = temp;
result[0] = index[0];
result[1] = index[1];
}
}
return result;
}
该程序仅通过了一些测试用例。我无法弄清楚这个程序中的问题,请你帮帮我。
答案 0 :(得分:1)
您的代码对两个值的所有组合进行AND,以找到最大值,错误得出结论,当您必须选择它们之间范围内的两个最大值时,此类组合的最大值将保持不变
E.g。对于输入6,2,8,6
,您得出结论,因为6&6
= 6
是最大值,答案是[0,3]
=&gt; 8,6,6,2
=&gt; 8&6
= 0
(糟糕!),而[0,1]
=&gt; 6,2
=&gt; 6&2
= 2
是正确答案。
你的逻辑的前提是有缺陷的。重新思考并重试。