-1

効率を上げるためにどの反復法を使用すればよいかわかりません。ここに、私が試した解決策をリストしました。反復する他の方法はありますか、つまり、特別な方法や方法はありますか?

方法 1:

ここでは 2 つの 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
    }
}

方法 3:

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
    }
}
4

3 に答える 3

1

LINQ メソッドを使用して、文字をグループ化し、数えることができます。

public void CountChar() {
  String s = Ipstring();
  foreach (var g in s.GroupBy(c => c)) {
    Console.WriteLine("{0} : {1}", g.Key, g.Count());
  }
}
于 2013-10-16T13:04:59.840 に答える
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 );
}
于 2013-10-16T13:08:37.987 に答える
0

ループはネストされていないため、複雑さは N*N (O(n^2)) ではなく、常に定数を無視できるため、O(N) を与える 2*N です。

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

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

これら 3 つのソリューションのどれが特定の環境で最速の実行時間を本当に知りたい場合は、ベンチマークを実行してください。

最もクリーンで読みやすいものが必要な場合 (ほとんどの場合、それを目指す必要があります)、単に LINQ を使用します。

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

O(N) でも実行されます。

于 2013-10-16T12:57:07.220 に答える