哪个迭代器(除了for,foreach)可用于计算字符串中的字符数?

时间:2013-10-16 12:46:15

标签: c# .net loops

我不知道使用什么迭代方法来提高效率,这里我列出了我尝试过的解决方案。有什么其他的迭代方式,我的意思是任何特殊的方法或方法?

方法一:

这里我使用了两个for循环,所以迭代进行了2N次

public void CountChar()
{
    String s = Ipstring();
    int[] counts = new int[256];
    char[] c = s.ToCharArray();
    for (int i = 0; i < c.Length; ++i)
    {
        counts[c[i]]++;
    }

    for (int i = 0; i < c.Length; i++)
    {
        Console.WriteLine(c[i].ToString() + " " + counts[c[i]]);
        Console.WriteLine();
    }
}

方法2:

public void CountChar()
{
    _inputWord = Ipstring();
    char[] test = _inputWord.ToCharArray();
    char temp;
    int count = 0, tcount = 0;
    Array.Sort(test);
    int length = test.Length;
    temp = test[0];

    while (length > 0)
    {
        for (int i = 0; i < test.Length; i++)
        {
            if (temp == test[i])
            {
                count++;
            }
        }

        Console.WriteLine(temp + " " + count);
        tcount = tcount + count;

        length = length - count;
        count = 0;
        if (tcount != test.Length)
            temp = test[tcount];
        //atchutharam. aaachhmrttu
    }
}

方法三:

public void CountChar()
{
    int indexcount = 0;
    s = Ipstring();
    int[] count = new int[s.Length];
    foreach (char c in s)
    {
        Console.Write(c);
        count[s.IndexOf(c)]++;
    }

    foreach (char c in s)
    {
        if (indexcount <= s.IndexOf(c))
        {
            Console.WriteLine(c);
            Console.WriteLine(count[s.IndexOf(c)]);
            Console.WriteLine("");
        }

        indexcount++;
        ////atchutharam
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用LINQ方法对字符进行分组并对其进行计数:

public void CountChar() {
  String s = Ipstring();
  foreach (var g in s.GroupBy(c => c)) {
    Console.WriteLine("{0} : {1}", g.Key, g.Count());
  }
}

答案 1 :(得分:0)

你的循环不是嵌套的,因此你的复杂性不是N * N(O(n ^ 2))而是2 * N,它给出了O(N),因为你总是可以忽略常量:

for(){}
for(){} // O(2N) = O(N)

for()
{
    for(){}
} // O(N*N) = O(N^2)

如果您真的想知道这三种解决方案中哪一种在特定环境中具有最快的执行时间,请执行基准测试。

如果你想要一个最干净和可读的(你应该几乎总是瞄准),只需使用LINQ:

String s = Ipstring();
int count = s.Count();

它也将在O(N)中执行。

答案 2 :(得分:0)

如果您需要数组中的结果:

var groups = s.GroupBy(i => i ).OrderBy( g => g.Key );
var chars = groups.Select(g => g.Key).ToArray();
var counts = groups.Select(g => g.Count()).ToArray();

否则:

var dict = s.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());

foreach (var g in dict)
{
    Console.WriteLine( "{0}: {1}", g.Key, g.Value );
}