好的,所以我试图创建一个能够查看数字数组并返回最多出现的数字的函数。我尝试通过设置计数器和for循环来做到这一点,但每次运行它时总是返回值9,即使它不在那里。
public static int ModalNumber(int[] numbers)
{
int ones = 0;
int twos = 0;
int threes = 0;
int fours = 0;
int fives = 0;
int sixes = 0;
int sevens = 0;
int eights = 0;
int nines = 0;
int zeroes = 0;
for (int i = 0; i < 10; i++)
{
if (numbers[i] == 0)
{
zeroes++;
}
else if (numbers[i] == 1)
{
ones++;
}
else if (numbers[i] == 2)
{
twos++;
}
else if (numbers[i] == 3)
{
threes++;
}
else if (numbers[i] == 4)
{
fours++;
}
else if (numbers[i] == 5)
{
fives++;
}
else if (numbers[i] == 6)
{
sixes++;
}
else if (numbers[i] == 7)
{
sevens++;
}
else if (numbers[i] == 8)
{
eights++;
}
else if (numbers[i] == 1)
{
nines++;
}
}
if (Convert.ToBoolean(zeroes >> ones & twos & threes & fours & fives & sixes & sevens & eights & nines))
{
return 0;
}
else if (Convert.ToBoolean(ones >> zeroes & twos & threes & fours & fives & sixes & sevens & eights & nines))
{
return 1;
}
else if (Convert.ToBoolean(twos >> zeroes & ones & threes & fours & fives & sixes & sevens & eights & nines))
{
return 2;
}
else if (Convert.ToBoolean(threes >> zeroes & ones & twos & fours & fives & sixes & sevens & eights & nines))
{
return 3;
}
else if (Convert.ToBoolean(fours >> zeroes & ones & twos & fours & fives & sixes & sevens & eights & nines))
{
return 4;
}
else if (Convert.ToBoolean(fives >> zeroes & ones & twos & threes & fours & sixes & sevens & eights & nines))
{
return 5;
}
else if (Convert.ToBoolean(sixes >> zeroes & ones & twos & threes & fours & fives & sevens & eights & nines))
{
return 6;
}
else if (Convert.ToBoolean(sevens >> zeroes & ones & twos & threes & fours & fives & sevens & eights & nines))
{
return 7;
}
else if (Convert.ToBoolean(eights >> zeroes & ones & twos & threes & fours & fives & sixes & sevens & nines))
{
return 8;
}
else
{
return 9;
}
我事先抱歉这是多么奇怪,但基本上这个功能使用了一个由任何人使用该程序输入的数字数组 - 我知道这不是问题所在因为我写了一些代码,在程序运行时显示它。任何人都可以提出一种工作方式或更高效的方法吗?感谢
答案 0 :(得分:4)
这应该可以使用LINQ来选择数组中最常出现的数字:
numbers.GroupBy(i => i).OrderByDescending(group => group.Count()).First().Key;
在处理数组,列表或序列时,我建议尝试考虑基于集合的操作需要做什么,因为它通常会简化解决方案。在这种情况下,您需要将数组中的不同值与它们出现的次数相关联,然后选择具有最大出现次数的值。这可以通过将整数集合在其标识(GroupBy(i => i)
)上,然后计算每个组中的出现次数(group => group.Count()
),按计数降序排序,并取第一个元素来完成
以防万一,因为你实际上说&#34;返回最多出现的数字&#34;,如果你真的想要数字而不是最常出现的数字,你可以相应地更改解决方案:
numbers.SelectMany(i => i.ToString().Select(c => Int32.Parse(c.ToString())))
.GroupBy(i => i).OrderByDescending(group => group.Count())
.First()
.Key;
答案 1 :(得分:1)
基本上,我就是这样做的(我不打算给你代码,因为它显然是功课):
int[10]
)。一个更好的选择是存储计数的字典,但我们现在将采用简单的方法。答案 2 :(得分:0)
不想为你做功课,但我已经有了这个
static int Most(int[] numbers)
{
int[] count = new int[10];
foreach (int n in numbers)
{
if (n > 9 || n < 0)
throw new ArgumentOutOfRangeException();
count[n]++;
}
int max = count[0];
int maxP = 0;
for(int p = 1; p < 10; p++)
{
if (count[p] > max)
{
max = count[p];
maxP = p;
}
}
return maxP;
}