我想检查一组数字中出现的具体数字。例如,数字2出现:
input from 1 to 20
output
3 times
另一个例子:
input from 1 to 100
output
19 times
这是我的代码
int count = 0;
string x = "";
string y = "";
string[] arr2 = new string[100000000];
for (int i = 1; i < arr2.Length; i++)
{
arr2[i - 1] = i.ToString();
}
foreach (var item in arr2)
{
for (int digit = 0;digit<item.Length;digit++)
{
if (digit == 2)
count++;
}
}
Console.WriteLine(count);
我的代码不起作用,但我不知道问题出在哪里。
注意:必须仅使用for
/ foreach
个循环,而不是使用Dictionary
或LINQ或DivRem
。
答案 0 :(得分:5)
一种有效而简洁的方法是使用Aggregate
来计算你的计数,而不是计算然后求和或类似(这种方法只需要一次通过数组):
arr2.Aggregate(0, (total, s) => total + s.Count(c => c == '2'))
这在功能上等同于:
int total = 0;
foreach (string s in arr2)
total += s.Count(c => c == '2');
如果您不想使用Linq或扩展方法,那么您可以使用上面的代码并展开剩余的扩展方法:
int total = 0;
foreach (string s in arr2)
{
foreach (char c in s)
{
if (c == '2')
total++;
}
}
请注意,在处理数字前将数字转换为string
有点浪费 - 您可以使用模数和除法运算符%
和/
直接检查数字(请注意,此代码需要进行小调整才能使用负数):
int total = 0;
foreach (int i in somearrayofnumbers)
{
while (i != 0)
{
if (i % 10 == 2)
total++;
i /= 10;
}
}
好吧,为了完成 - 我能想到的最好的方法就是上面的混合:
int CountDigits(int in, int val)
{
int total = 0;
while (in != 0)
{
if (in % 10 == val)
total++;
in /= 10;
}
return total;
}
...
int digitCount = numbers.Aggregate((total, i) => total + CountDigits(i, 2));
使用Math.DivRem
非常难以理解,因此坚持上述%
和/
。