我最近遇到过这行代码,它的作用是通过一个数组并返回最常见的值。例如1,1,2,1,3因此它将返回1,因为它看起来超过2和3.我想要做的是理解它是如何工作的所以我做的是我通过visual studio逐步完成它一步,但它没有敲响任何铃声。
任何人都可以帮我理解这里发生了什么吗?如果有人可以告诉我c做了什么以及if语句中参数背后的逻辑,那将是一个全面的加分。
int[] arr = a;
int c = 1, maxcount = 1, maxvalue = 0;
int result = 0;
for (int i = 0; i < arr.Length; i++)
{
maxvalue = arr[i];
for (int j = 0; j <arr.Length; j++)
{
if (maxvalue == arr[j] && j != i)
{
c++;
if (c > maxcount)
{
maxcount = c;
result = arr[i];
}
}
else
{
c=1;
}
}
}
return result;
答案 0 :(得分:1)
编辑:经过仔细检查,代码片段有一个嵌套循环,通常只需跟踪最大可见时间和看到的元素并保持同步,就可以计算出看到的最大元素。
这看起来像是Boyer-Moore多数计票算法的实现。他们有一个很好的插图here。
逻辑很简单,就是在一次通过中计算多数,花费O(n)时间。请注意,此处的多数意味着必须使用该元素填充超过50%的数组。如果没有多数元素,则会得到“不正确”的结果。
通常会在单独的通道中验证元素是否实际形成多数。
答案 1 :(得分:1)
它不是计算最常见的元素 - 计算的是最长的元素。
此外,它没有非常有效地执行,内部循环只需要计算到i-1,而不是arto.Length。
c跟踪当前的运行长度。第一个“如果”是检查这是否是“连续运行”。第二个“if”(在到达运行中的最后一个元素之后)将检查此运行是否比您到目前为止看到的任何运行都长。
在上面的输入示例中,您获得1作为答案,因为它是最长的运行。尝试使用输入,其中运行时间最长的元素与最常用的元素不同。 (例如,2,1,1,1,3,2,3,2,3,2,3,2 - 这里2是最常见的元素,但1,1,1是最长的运行)。