Массив может иметь только один дубликат или вообще не иметь его.
Мне нужен алгоритм, чтобы пройти несколько модульных тестов и иметь разные версии, которые не проходят разные тесты.
Если вы можете Если бы вы нашли что-то не так с этими двумя решениями или знаете более быстрые, я был бы признателен.
Хеширование:
Это не проходит тесты продолжительности для массива размером UInt16.MaxValue с и без повторяющееся значение.
Passed - пустой массив не содержит повтор
Passed - маленький массив без повторов
Passed - небольшой массив с повторением (Repeated)
Passed - малый массив с repeat ( Repeat)
Passed - Большой массив без повторов (Repeated)
Failed - Большой массив без повторов (Duration)
Passed - Большой массив с повторением (Repeated)
Passed - Большой массив с повторением ( Повторите)
Не удалось - Большой массив с повторением (Длительность)
Не удалось - Объединено
public bool ContainsRepeat(UInt16[] values, out UInt16 repeat)
{
//HASH SET//
var set = new HashSet<UInt16>();
repeat = 0;
foreach (UInt16 value in values)
{
if (!set.Add(value))
{
repeat = value;
return true;
}
}
return false;
}
Сортировка и затем двоичный поиск дубликатов:
Это не удается Тест на рацион для того же массива размером UInt16.MaxValue, но только когда нет повторений, но также не удается вернуть правильное значение повторения, когда оно есть, даже если оно работает для меньшего массива.
Passed - пустой массив не содержит повтор
Пропущено - Маленький массив без повторов
Пропущено - Маленький массив с повторением (повтор)
Пропущено - Маленький массив с повторением (повтор)
Пропущено - Большой массив без повторов ( Repeated)
Failed - Большой массив без повторов (Duration)
Passed - Большой массив с повторением (Repeated)
Failed - Большой массив с повторением (Repeat)
Passed - Большой массив с повторением (Duration )
Failed - Combined
public bool ContainsRepeat(UInt16[] values, out UInt16 repeat)
{
int findRepeatingElement(UInt16[] arr, int low, int high)
{
if (low > high)
return -1;
int mid = (low + high) / 2;
if (arr[mid] != mid + 1)
{
if (mid > 0 && arr[mid] == arr[mid - 1])
return mid;
return findRepeatingElement(arr, low, mid - 1);
}
return findRepeatingElement(arr, mid + 1, high);
}
repeat = 0;
if (values.Length <= 1)
{
return false;
}
Array.Sort(values);
int index = findRepeatingElement(values, 0, values.Length - 1);
if (index != -1)
{
repeat = values[index];
return true;
}
else
{
return false;
}
}
Это мой первый пост, поэтому приветствуются любые материалы о форматировании будущих вопросов:)