我试图找到
的解决方案在每个整数所在的整数数组中求和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
,但我认为典型的编程访谈允许我做出这样的假设,这样我就不必浪费时间编写一堆错误处理意外输入)
答案 0 :(得分:2)
您的代码在
调用未定义的行为 for (int i = 0; i < size; ++i)
++cntArr[anData[i]];
当您访问第11个元素(i = 10
)时,因为cntArr
只有10个元素
诸如AddressSanitizer之类的内存检查器会立即指示您。
您并没有真正调用系统调用来创建新套接字,但由于未定义的行为,可能会发生任何事情。