【发布时间】:2020-08-09 06:54:27
【问题描述】:
数组只能有一个重复项或根本没有。
我需要该算法通过一些单元测试,并有不同的版本通过不同的测试。
如果您发现这两种解决方案有任何问题或知道更快的解决方案,我将不胜感激。
散列:
对于大小为 UInt16.MaxValue 的数组(包含和不包含重复值)的持续时间测试失败。
通过 - 空数组不包含重复
通过 - 没有重复的小数组
通过 - 带有重复的小数组(重复)
通过 - 带有重复的小数组(重复)
通过 - 没有重复的大型数组(重复)
失败 - 没有重复的大型数组(持续时间)
通过 - 带有重复的大型数组(重复)
通过 - 带有重复(重复)的大型数组
失败 - 具有重复(持续时间)的大型数组
失败 - 合并
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 数组的持续时间测试失败,但只有在没有重复时才会失败,而且在有重复值时也无法返回正确的重复值,即使它适用于较小的数组。
通过 - 空数组不包含重复
通过 - 没有重复的小数组
通过 - 带有重复的小数组(重复)
通过 - 带有重复的小数组(重复)
通过 - 没有重复的大型数组(重复)
失败 - 没有重复的大型数组(持续时间)
通过 - 带有重复的大型数组(重复)
失败 - 带有重复(重复)的大型数组
通过 - 具有重复(持续时间)的大型数组
失败 - 合并
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;
}
}
这是我的第一篇文章,因此也欢迎任何有关格式化未来问题的意见:)
【问题讨论】:
-
这些失败的测试是否会抛出异常?
-
否,但持续时间需要低于 2 毫秒
标签: c# arrays performance time duplicates