用数学形式替换连续数字

Replace consecutive numbers with mathematical form

我正在研究压缩算法,我想替换所有连续数字数学 形式不符合逻辑 数学 但我的算法会知道并将其转换为原始形式。
假设我有字符串:

string input = "732183900000000000002389288888888888888";

你看到了吗00000000008888888888888是主要的连续重复.
现在我想将它们转换为:

//convert 000000000 to 0*9. Means 9 times 0.
//convert 888888888 to 8*9. Means 8 times 0.
string output = "7321839" +
                "0*13"    +
                "23892"   +
                "8*14";
//or
string output = "7321839-0*13-23892-8*14";

要考虑的要点:
任何适用于 windows 语言 都将被 接受。对我来说主要是算法.
请牢记 性能,因为它将用于 文件。

老实说,这很简单:

  • 一次解析字符串一个字符。
  • 检查前一个字符是否与当前字符相同。
  • 如果相同则递增计数器变量,否则将其重置为 0。
  • 如果我们将计数器重置为 0 时计数器值大于 1,则将 * 添加到结果中。

考虑到破折号的规则,正则表达式可能有点复杂(尽管并非不可能),

看来,你想要的是下面的

  1. 相同数量大于 1 的组
  2. 没有前缀破折号
  3. 无后缀破折号
  4. 没有双破折号(推测)

这是一个相当高效的 C# O(n) 实现 StringBuilder,它 inurn 应该允许您以最少的分配处理非常大的字符串

给定

public static string Shorten(string value)
{
    var sb = new StringBuilder(value.Length);
    int i, last;
    var isLastGroup = false;

    void Write()
    {
        var isGroup = i - last > 1;
        var getDash = last == 0 || isLastGroup ? "" : "-";
        sb.Append(isGroup ? $"{getDash}{value[last]}*{i - last}{(i != value.Length ? "-" : "")}" : value[last].ToString());
        isLastGroup = isGroup;
        last = i;
    }

    for (i = 0, last = 0; i < value.Length; i++)
        if (value[last] != value[i])
            Write();

    Write();

    return sb.ToString();
}

测试

Console.WriteLine(Shorten("1"));
Console.WriteLine(Shorten("111"));
Console.WriteLine(Shorten("1112"));
Console.WriteLine(Shorten("1222"));
Console.WriteLine(Shorten("12233344445555512345"));

结果

1
13
1
3-2
1-23
1-2
2-33-44-5*5-12345

Full Demo Here