[英]Find largest value x in array a so that -x also in a using C code (interview question)
你得到一个整数数组a
。 需要返回a
中的最大值x
使得-x
也在a
中。 如果没有这样的值 - 返回 0。
例子:
对于[6,5,2,-1,-2,-5]
,返回值为5
,因为-5
在数组中(答案不是6
,因为-6
不在数组中)。
编辑:输入数组不一定排序。
现在,如果我可以使用 Java - 我会使用HashSet
来解决它,我会将所有数组元素添加到它们的绝对值中,遍历数组并更新最大值,如果它是我迄今为止看到的最大值,如果我在 Hash 中找到它的绝对值。这将导致O(n)
平均时间。
但是在面试中我需要使用 C 代码来解决它,而不需要创建任何特殊的数据结构,如HashSet
。
我唯一的想法是对数组进行排序,使用两个指针(一个用于开始,一个用于结束)并将指针相互移动直到找到答案。 这还不够好,因为它是O(nlogn)
。
您知道如何仅使用内置库在O(n)
的 C 代码中解决它吗?
#include <stdio.h>
#include <stdlib.h>
int found = 0;
int n = 0;
int len = 6; // your array has 6 elements
for(int i = 0; i < len -1; i++) {
for(int j = i+1; j < len; j++) {
if(a[i] == -a[j] && (found = 0 || abs(a[i] > n)) n = abs(a[i]);
}
}
if(found) printf("Number is : %d\n", n);
else printf("Not found");
好的,这是没有库的真正 O(n) 解决方案,但需要有序数组。 只需一个循环,并移动指针 initial 和 final。
#include <stdio.h>
int a[] = {6,5,2,-1,-2,-5};
int main(int argc, char** argv) {
int* left = a; // point to first
int* right = a + 5; // point to last
while(right > left) {
int result = *left + *right;
if(!result) {
printf("Number is %d\n", *left);
return 0;
}
if(result > 0) left++;
else right--;
}
printf("No result");
return 1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.