这是一个整数序列,我必须找到最重复的值。包含许多重复值,找到所有重复值的最低值。
示例:如果{-10,17,13,17,-10,21},则结果为-10
到目前为止我已经走了多远:
static void YL2()
{
Random random = new Random();
int mitu = 10, minv = 0, maxv = 20;
int[] mas1 = new int[mitu];
int i;
int lowest;
for (i = 0; i < mitu; i++) mas1[i] = random.Next(minv, maxv);
for (i = 0; i < mitu; i++)
Console.Write("{0,4}", mas1[i]);
Console.Write("\n\n");
int count = 0;
List<int> checkedNumbers = new List<int>();
foreach (int t in mas1)
{
if (!checkedNumbers.Contains(t))
{
foreach (int m in mas1)
{
if (m == t)
{
count++;
}
}
Console.WriteLine("Number {0} is repeated {1} times", t, count);
count = 0;
checkedNumbers.Add(t);
}
}
for (lowest = mas1[0], i = 1; i < mitu; i++)
{
if (mas1[i] < lowest) lowest = mas1[i];
}
Console.Write("Lowest value is {0}\n\n", lowest);
}
答案 0 :(得分:1)
Linq方式:
var lowestMaxCountDuplicate = sequence
.GroupBy(i => i)
.OrderByDescending(g => g.Count())
.ThenBy(g => g.Key)
.First().Key;
答案 1 :(得分:1)
这种方式不涉及替换您使用LINQ编写的所有代码,因为您自己已经完成了很多代码:
在声明中,将int lowest;
替换为
bool foundOne = false;
int lowest = int.MaxValue;
我们将继续跟踪最低重复次数。
在Console.WriteLine("Number {0} is repeated {1} times", t, count);
之后,添加
if (count > 1 && t < lowest)
{
foundOne = true;
lowest = t;
}
即。如果数字重复并且低于我们到目前为止找到的最低重复数字,则存储此数字。此外,我们会跟踪是否找到任何重复的数字。请注意,因为我们首先将lowest
设置为int.MaxValue
,我们找到的第一个重复数字将始终低于它(或它是相同的,在这种情况下它是正确的反正)。
然后在最后,而不是你的for
循环,有以下内容:
if (foundOne)
Console.Write("Lowest repeated value is {0}\n\n", lowest);
else
Console.Write("No repeated values found\n\n");
以防每个数字都不同。
这个 的效率低于LINQ,因为你在列表中循环的次数远远超过你的需要,但我认为你可能想要一个不会丢掉你所有东西的解决方案已完成。