"不允许系统调用:SYS_socketcall"当我试图解决"对数组中最大的n个整数求和时#34;编程挑战

时间:2015-04-22 13:46:49

标签: c++ algorithm

我试图找到

的解决方案
  

在每个整数所在的整数数组中求和n个最大整数   在0到9之间

int SumNLargest(int* anData, int size, int n)

编程挑战提示,一个解决方案,除了明显的一个排序数组的副本,并返回最后9个元素的总和。所以我尝试编写下面的线性解决方案

#include <iostream>

int SumNLargest(int* anData, int size, int n)
{
// Sum n largest integers in an array of integers where every integer is between 0 and 9
    int cntArr [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    for (int i = 0; i < size; ++i) ++cntArr[anData[i]];
    int sum = 0;
    for (int i = size - 1; i >= 0; --i)
    {
        sum += (n - cntArr[i]) >= 0 ?  cntArr[i] * i : n * i;
        --n;
        if (n <= 0) break;
    }   
    return sum;
}


int main()
{
    int myArray [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 12, 15};
    std::cout << SumNLargest(myArray, sizeof(myArray)/sizeof(int), 2);
    return 0;
}

但我收到了错误

  

不允许系统调用:SYS_socketcall

请参阅:http://codepad.org/UILgXDzQ

这是我的逻辑问题吗?如果是的话,在哪里?另外,我应该做一个更优雅的线性解决方案吗?

(最后,我意识到我的解决方案假定n >= size >= 1,但我认为典型的编程访谈允许我做出这样的假设,这样我就不必浪费时间编写一堆错误处理意外输入)

1 个答案:

答案 0 :(得分:2)

您的代码在

调用未定义的行为
 for (int i = 0; i < size; ++i) 
        ++cntArr[anData[i]]; 

当您访问第11个元素(i = 10)时,因为cntArr只有10个元素 诸如AddressSanitizer之类的内存检查器会立即指示您。

您并没有真正调用系统调用来创建新套接字,但由于未定义的行为,可能会发生任何事情。