【问题标题】:Get Occurrences of Letters in A String获取字符串中出现的字母
【发布时间】: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();
}

有没有更好的想法我可以解决以获得第二个输入样本的预期输出?我可以理解,我足够接近并且可能缺少一些足够简单的东西。

代码示例:Count Occurrences of Letters

【问题讨论】:

  • 您可以使用 MoreLinq 的 GroupAdjacentstring.Concat(str.GroupAdjacent(c =&gt; c).Select(grp =&gt; $"{grp.Count()}{grp.Key}"))

标签: c# list


【解决方案1】:

我们为什么不直接遍历value 并计数呢?我们可以有两种可能:

  1. 当字符c不等于current(我们有不同的字符)我们应该写下之前的序列并开始一个新的
  2. 否则,将1 添加到count

    代码:

    private static string Compress(string value) {
      if (string.IsNullOrEmpty(value))
        return value;
    
      char current = '
【解决方案2】:

好吧,我以以下代码示例结束:

public static void Main()
{
    string str = "AAAAABBCCCDDDDAABBBBAABB";
    int count = 1;
    
    char[] charVal = str.ToCharArray();
    
    List<string> charCnt = new List<string>();
    charCnt.Add("");
    
    string concat = "";
    
    //Getting each letters using foreach loop
    foreach (var ch in charVal)
    {
        var lastItem = charCnt.LastOrDefault();
        if (lastItem.EndsWith((ch.ToString()))) //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; //Concatenate items from the list
    }

    Console.WriteLine(concat.Trim());
}

这是一个工作样本:Get Occurrences of Letters in A String

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2022-01-07
    • 1970-01-01
    • 2012-09-14
    • 2021-03-30
    • 2023-03-11
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多