我有一个字符串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++;
}
}
它给了我输出但这个逻辑不好。我可以使用哪些其他算法或方法?
答案 0 :(得分:11)
这应该为您提供结果所需的所有数据。
如果您需要该格式的结果,您应该能够将它们附加到字符串中(使用StringBuilder
)。
var results = s.GroupBy(c => c)
.Select(group => new
{
Letter = group.Key,
Count = group.Count()
});
答案 1 :(得分:1)
一个想法是让List<Tuple<char,int>>
预先填充每个char
和0
。
遇到时增加每个字符的值。
for (int i=0;i<a.lenghth;i++)
{
myList.Single(t => t.Item1 == a[i]).Item2++;
}
答案 2 :(得分:1)
概括而言:
答案 3 :(得分: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中完成
答案 4 :(得分:1)
使用Dictionary类型的字典。在第一次出现时,在每个后续增量中添加到字典中。
这样你可以使用你想要的任何字符(并控制如何处理案例),而不仅仅是处理26
答案 5 :(得分: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());
答案 6 :(得分: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();;
答案 7 :(得分: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]));
}
答案 8 :(得分:0)
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();
答案 9 :(得分:-1)
此代码应该在cpp中工作
int* count = new int[26];
for (int i = 0; i < a.length; i++)
count[a[i] - 'a']++;
在c#中你需要玩一点,所以你好好把char看成一个数字。