Просто измените определение функции getScores
и аргумент объявления class
с
`int getScores(FILE *input, Student class);`
на
`int getScores(FILE *input, Student *class);`
Вы можете:
function has_dupes($array) {
$dupe_array = array();
foreach ($array as $val) {
if (++$dupe_array[$val] > 1) {
return true;
}
}
return false;
}
function hasDuplicate($array){
$d = array();
foreach($array as $elements) {
if(!isset($d[$elements])){
$d[$elements] = 1;
}else{
return true;
}
}
return false;
}
Два способа сделать это эффективно, о которых я могу думать:
вставка всех значений в какой-то хеш-таблица и проверка того, находится ли в ней вставляемое вами значение (ожидаемое время O (n) и пространство O (n))
, сортировка массива и затем проверка, равны ли соседние ячейки (время O (nlogn) и O (1) или O (n) пробел в зависимости от алгоритма сортировки)
решением stormdrain, вероятно, будет O (n ^ 2), как и любое решение, которое включает сканирование массива для каждого элемента в поисках дубликата
Как вы конкретно сказали, что не хотите использовать array_unique
, я проигнорирую другие ответы, несмотря на то, что они, вероятно, лучше.
Почему бы вам не использовать array_count_values () , а затем проверить, имеет ли результирующий массив какое-либо значение больше 1?
Я знаю, что вам не нужен array_unique()
. Однако вы не найдете волшебной очевидной функции, и ее написание не будет быстрее, чем использование родных функций.
Я предлагаю:
function array_has_dupes($array) {
// streamline per @Felix
return count($array) !== count(array_unique($array));
}
Настроить второй параметр array_unique()
для удовлетворения ваших потребностей в сравнении.