繁体   English   中英

使用 C 代码在数组 a 中找到最大值 x 使得 -x 也在 a 中(面试问题)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM