-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

11

这应该为您提供结果所需的所有数据。

StringBuilder如果您需要该格式的结果,您应该能够将它们附加到字符串中(使用 a )。

var results = s.GroupBy(c => c)
    .Select(group => new
    {
        Letter = group.Key,
        Count = group.Count()
    });
于 2012-08-07T20:00:58.373 回答
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 回答
1

使用 Dictionary 类型的字典。在第一次出现时添加到字典中,在每个后续增量中。

这样你就可以使用你想要的任何字符(并控制如何处理大小写),而不仅仅是处理 26

于 2012-08-07T20:01:19.883 回答
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

假设您正在对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

一个想法是有一个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

笼统:

  1. 对字符进行排序以获得每个字符的 1 个实例的排序列表
  2. 创建一个与排序列表大小相同的计数器列表(每个计数器从 0 开始)
  3. 循环遍历字符串中的每个字符,递增对应的计数器
  4. 循环排序列表,从排序列表和计数器构造结果。
于 2012-08-07T19:58:22.997 回答
0

尝试这个:

        string a = "aaabbbasdlfjasldfkjalsdkfjaewoasdfj";

        //store character counts in a dictionary 
        Dictionary<char, int> charCounts = new Dictionary<char, int>();

        //iterate through string and place counts in dictionary
        for (int i = 0; i < a.Length; i++)
        {
            if (!charCounts.Keys.Contains(a[i]))
            {
                charCounts[a[i]] = 1;
            }
            else
            {
                charCounts[a[i]] += 1;
            }
        }

        //output sorted list
        foreach (char letter in charCounts.Keys.OrderBy(x => x))
        {
            Console.Write(string.Format("{0}{1}", letter, charCounts[letter]));
        }
于 2012-08-07T20:02:24.223 回答
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# 中,您需要稍微玩一下,以便将字符视为数字。

于 2012-08-07T19:57:56.733 回答