用数学形式替换连续数字[关闭]

Posted

技术标签:

【中文标题】用数学形式替换连续数字[关闭]【英文标题】:Replace consecutive numbers with mathematical form [closed] 【发布时间】:2020-12-08 05:13:31 【问题描述】:

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

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语言都将被接受。对我来说主要的是算法。 请牢记性能,因为它将用于文件。

【问题讨论】:

你试过什么?它是如何未能满足您的要求的? Stack Overflow 不是代码编写服务。关于您的问题,这似乎是对输入字符串进行简单的线性扫描,以保持计数连续看到当前数字的次数会很好,但是您仍然需要决定一个数字之前必须重复多少次你用输出中的简写替换它的出现。 谢谢。我尝试了正则表达式和其他 SO 答案,但没有运气。我相信它可以使用 c# regex 进行存档。 google RLE(运行长度编码) @Spektre 哇。我不知道 RLE,但我的算法做同样的事情。你可以回答,我会打勾。我发现了很多东西。 ***.com/a/27573642/14784394 , gist.github.com/sujaykundu777/9ee3328bf15fcc2b41a3576cf08b996c 与C# regex. 【参考方案1】:

说实话,这很简单:

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

【讨论】:

您可能会将阈值设置为高于连续 2 个实例。例如,将55“压缩”到-5*2- 没有多大意义。但基本想法似乎是合理的。 @NathanPierson 对。不应压缩短字符串。但应该很长。 @saurav-chanda 谢谢。代码实现将不胜感激。特别是正则表达式。【参考方案2】:

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

看起来,你想要以下

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

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

给定

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 ? $"getDashvalue[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 13-2 1-23 1-22-33-44-5*5-12345

Full Demo Here

【讨论】:

以上是关于用数学形式替换连续数字[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用字符串中的任何字符查找任何数字和空格的匹配模式并替换为 |在 PHP [关闭]

将数字转换为二进制并在java中以二进制数计数连续1的[关闭]

在php中生成连续数字[关闭]

用初学者的话来说,NaN(非数字)是啥? [关闭]

用 php 将每个 font size="" 替换为 font-size: ;如何? [关闭]

使用溢出处理读取并添加两次(数值数学)[关闭]