"Запрещенный системный вызов: SYS_socketcall", когда я пытаюсь решить задачу "сумма наибольших n целых чисел в массиве"
Я пытаюсь найти решение для
Совокупность 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
Ваш код вызывает поведение undefined в
for (int i = 0; i < size; ++i)
++cntArr[anData[i]];
когда вы обращаетесь к одиннадцатому элементу (i = 10
), потому что cntArr
имеет только 10 элементов.
Контроллер памяти, такой как AddressSanitizer, сразу сообщит вам об этом.
Вы не вызываете системный вызов для создания нового сокета, но в результате поведения undefined может случиться что-то.