【发布时间】:2022-10-25 12:07:35
【问题描述】:
我正在尝试计算字符串中字母的出现次数,并且几乎使用以下代码 sn-p 得到了结果:
public static void GetNoofLetters()
{
string str = "AAAAABBCCCDDDD";
int count = 1;
char[] charVal = str.ToCharArray();
List<string> charCnt = new List<string>();
string concat = "";
//Getting each letters using foreach loop
foreach (var ch in charVal)
{
int index = charCnt.FindIndex(c => c.Contains(ch.ToString())); //Checks if there's any existing letter in the list
if(index >= 0) //If letter exists, then count and replace the last value
{
count++;
charCnt[charCnt.Count - 1] = count.ToString() + ch.ToString();
}
else
{
charCnt.Add(ch.ToString()); //If no matching letter exists, then add it to the list initially
count = 1;
}
}
foreach (var item in charCnt)
{
concat += item;
}
Console.WriteLine(concat.Trim());
}
该代码适用于给定的输入样本并返回输出为:5A2B3C4D.就是这么简单。
但是说我有以下输入:第二个输入样本
string str = "AAAAABBCCCDDDDAA";
预期产出:
5A2B3C4D2A
使用上面的代码,我返回输出如下:
5A2B3C6A
以下代码sn-p实际上发生了上述情况:
if(index >= 0) //If letter found, then count and replace the last value
{
count++;
charCnt[charCnt.Count - 1] = count.ToString() + ch.ToString();
}
有没有更好的想法我可以解决以获得第二个输入样本的预期输出?我可以理解,我足够接近并且可能缺少一些足够简单的东西。
【问题讨论】:
-
您可以使用 MoreLinq 的
GroupAdjacent、string.Concat(str.GroupAdjacent(c => c).Select(grp => $"{grp.Count()}{grp.Key}"))