我有经典的查找重复算法,如下所示:
int n = int.Parse(Console.ReadLine());
Console.WriteLine();
List<int> tempArr = new List<int>();
List<int> array = new List<int>();
for (int i = 0; i < n; i++)
{
Console.Write("input number {0}: ", i + 1);
tempArr.Add(int.Parse(Console.ReadLine()));
}
tempArr.Sort();
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
if (tempArr[i] == tempArr[j])
{
array.Add(tempArr[i]);
}
}
}
一切正常,但如果我只有两个重复的数字,如(1, 2,2 ,3,4,5)我怎样才能将它们添加到List<int> **array**
在循环中有一个干净的镜头?
答案 0 :(得分:1)
您可以使用某种具有更好搜索功能的数据结构(例如哈希表或二叉树),而不是列表。即使您只有一个副本,问题是您需要检查是否已在列表中添加了元素,因此算法中的关键操作是搜索。执行搜索的速度越快,算法的速度就越快。使用二分搜索,这是最快的搜索方式,你得到O(nlogn)(你执行n次搜索O(logn))。
更好的方法是使用某种类型的数组,其大小与输入范围相同,并且&#34; tick&#34;你已经拥有的每一个价值。此搜索以恒定时间运行,但如果您有大范围的输入则效率低下。
答案 1 :(得分:0)
您可以使用distinct:
array = tempArr.Distinct().ToList();
Distinct
不是线性时间,如果这是你正在寻找的东西(&#34;一个干净的镜头&#34;)。如果您对输入有更多了解,可以在线性时间找到一种方法。例如,如果您知道所采用的整数是否在某个范围内。
答案 2 :(得分:0)
提取您可以使用的所有重复项 Linq :
test/java