我正在编写一个程序,它应该将一个字符串拆分成相同字母的组,然后 for each 组计算大小写字母的数量并将它们相乘,然后将每个组的值与整个字符串的总和相加,并输出总值.

因此,例如,如果字符串是"ccCeEEEcBbBbb",在第一组字母(Ccc)中有两个小写字母和一个大写字母(2x1),在第二组字母(Eeee)中有一个小写字母和三个大写字母(1x3),在第三组字母(C)中有一个小写字母,没有大写字母(1x0),在最后一组字母(Bbbbb)中有三个小写字母和两个大写字母(3x2)-因此总数将是(2x1)+(1x3)+(1x0)+(3x2)=2+3+0+6=11.

以下是我到目前为止编写的代码:

//string[] letters = { "a" };
//string[] letters =  { "aA" };
//string[] letters = { "Aa" };
//string[] letters = { "AAa" };
//string[] letters =  { "aaA" };
//string[] letters = { "aAa" };
//string[] letters =  { "AaA" };
//string[] letters = { "aAabB" };
//string[] letters =  { "aAabBB" };
//string[] letters = { "AAaBbBaaA" };
string[] letters =  { "AaAbAaA" };


//string[] letters = { "ccCeEEEcBbBbb" };

foreach (string letter in letters)
{
    int total = 0;
    int upper = 0;
    int lower = 0;
    StringBuilder sb = new StringBuilder(letter.Length);
    char lastChar = '\0';
    foreach (char c in letter)
    {
        if (c != lastChar)
        {
            sb.Append(c);
            lastChar = c;
        }
    }
    string data = sb.ToString().ToLower();
    for (int i = 0; i < data.Length; i++)
    {
        if (char.IsUpper(data[i]))
        {
            upper++;
        }
        else
        {
            lower++;
        }
    }
    total = upper * lower;
    Console.WriteLine(total);
}

到目前为止我面临的问题是

无论测试数据如何,控制台中的输出始终显示0.

Argument                             : Expected           : Actual
----------------------------------------------------------------------
a                                    : 0                  : 0 
aA                                   : 1                  : 0
Aa                                   : 1                  : 0
AAa                                  : 2                  : 0
aaA                                  : 2                  : 0

我转到调试器中的监视窗口,所有变量都有值,但我仍然不知道错误可能在哪里?

我有一种预感,使用char可能是个问题.

推荐答案

您可以实现一个简单的有限状态机:

private static int SolveIt(string value) {
  int result = 0;

  char prior = '\0';

  int lower = 0;
  int upper = 0;

  foreach (char letter in value) {
    if (prior != char.ToLower(letter)) {
      result += lower * upper;

      lower = 0;
      upper = 0;

      prior = char.ToLower(letter);
    }

    if (char.IsLower(letter))
      lower += 1;
    else
      upper += 1;
  }

  return result + lower * upper;
}

演示:

int result = SolveIt("ccCeEEEcBbBbb");

Console.WriteLine(result);

输出:

11

Csharp相关问答推荐

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

PredicateBuilder不是循环工作,而是手动工作

如何在Visual Studio中为C# spread操作符设置格式规则?

有没有办法把+02:00转换成TimeSpan?""

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

在具有主构造函数的类中初始化属性时出现警告

不带身份的Blazor服务器.Net 8 Cookie身份验证

有没有办法使.NET 6应用程序在特定的.NET 6运行时版本上运行

C#方法从AJAX调用接收NULL

如何在页面重新加载后保持菜单切换状态

持有者安全定义未显示在Swagger.NET 8中

为基本审计设置Audit.EntityFramework.Core

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

单元测试:模拟返回空

正在try 从Blazor中的API读取JSON

为什么方法的值在SELECT方法中不会更改?

RabbitMQ群集的MassTransit配置问题

Content WithTargetPath实际上是有效的MSBuild项吗?

C#;AvaloniaUI;MVVM;当另一个窗口上的按钮被单击时,如何更新视图图像源?

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类