-4

私は文字列を持っていますa = "aabbbffdshhh"。を出力するプログラムを書きたいです"a2b3f2d1s1h3"。現在のアルファベットの各文字を返したいのですが、それはカウントです。

私が現在使用しているコードは次のとおりです。

int cnta;int cntb; int cntf; int cnth;

for (int i=0;i<a.lenghth;i++)
{
   if(a[i]=='a')
   {
      cnta++;
   }
   if(a[i]=='b')
   {
      cntb++;
   }
   if(a[i]=='h')
   {
   cnth++;
   }
}

それは私に出力を与えていますが、このロジックは良くありません。他にどのようなアルゴリズムやアプローチを使用できますか?

4

10 に答える 10

1

1つのアイデアは、それぞれを事前に入力する場所List<Tuple<char,int>>を用意することです。char0

遭遇したときに各文字の値をインクリメントします。

for (int i=0;i<a.lenghth;i++)
{
  myList.Single(t => t.Item1 == a[i]).Item2++;
}
于 2012-08-07T19:55:52.760 に答える
1

Run-length Encodingのわずかなバリエーションを行っていると仮定すると、これにより文字列がエンコードされます。私のコメントは答えられなかったので、これを推測として提起しています。デコーディングは演習として残します (または、単に rosettacode を調べて実装を確認してください)。

var a = "aabbbffdshhh";
var rle = new StringBuilder();

var last = a[0];
var count = 1;
for (int i = 1; i < a.Length; i++)
{
    if (a[i] != last)
    {
        rle.AppendFormat("{0}{1}", last, count);
        last = a[i];
        count = 0;
    }

    count++;
}

rle.AppendFormat("{0}{1}", last, count);

Assert.AreEqual("a2b3f2d1s1h3", rle.ToString());
于 2012-08-07T20:25:37.583 に答える
1

1 行の超可読コード (皮肉) で実行できます :-) これは要求されていませんが、orderby を追加しました。必要に応じて削除できます。

        string a = "aaaadjkhsdfkjsdjkfhsdkjff";
        var res = a.GroupBy(c => c).OrderBy(g => g.Key).Aggregate("", (p, g) => p += g.Key + g.Count().ToString());

または、文字列の連結が非効率的すぎると考えている場合

        var res2 = a.GroupBy(c => c).OrderBy(g => g.Key).Aggregate(new StringBuilder(), (p, g) => p.Append(g.Key + g.Count().ToString())).ToString();;
于 2012-08-07T20:32:28.273 に答える
1

一般的には:

  1. 文字を並べ替えて、各文字の 1 つのインスタンスを含む並べ替えられたリストを取得します
  2. ソートされたリストと同じサイズのカウンターのリストを作成します (各カウンターは 0 から始まります)
  3. 文字列内の各文字をループして、対応するカウンターをインクリメントします
  4. 並べ替えられたリストとカウンターから結果を構築する並べ替えられたリストをループします。
于 2012-08-07T19:58:22.997 に答える
1
var input = "aabbbffdshhh";

var characters = input.ToArray();

StringBuilder sb = new StringBuilder();
characters.ToList().ForEach(c=>{if(!sb.ToString().Contains(c)){sb.Append(c); sb.Append(characters.ToList().Count(cc=>cc == c));}});

//sb.ToString().Dump(); //output is a2b3f2d1s1h3

LinqPad で実行

于 2012-08-07T19:59:57.667 に答える
0

C# では、次のことができます。

Dictionary<char, int> d = new Dictionary<char, int>();
foreach(char c in a){
    if(d.ContainsKey(c)){
        d[c] = d[c] + 1;
    } else {
        d[c] = 1;
    }
}
StringBuilder sb = new StringBuilder();
foreach(KeyValuePair p in d){
    sb += p.Key.ToString() + p.Value.Tostring();
}
return sb.ToString();
于 2012-08-07T20:04:33.323 に答える
-1

このコードは cpp で動作するはずです

int* count = new int[26];
for (int i = 0; i < a.length; i++)
  count[a[i] - 'a']++;

C# では、char を数値としてよく見られるように、少しいじる必要があります。

于 2012-08-07T19:57:56.733 に答える