用数学形式替换连续数字
Replace consecutive numbers with mathematical form
我正在研究压缩算法,我想替换所有连续数字其 数学 形式不符合逻辑 数学 但我的算法会知道并将其转换为原始形式。
假设我有字符串:
string input = "732183900000000000002389288888888888888";
你看到了吗0000000000和8888888888888是主要的连续重复.
现在我想将它们转换为:
//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 的组
- 没有前缀破折号
- 无后缀破折号
- 没有双破折号(推测)
这是一个相当高效的 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
13-2
1-23
1-22-33-44-5*5-12345
我正在研究压缩算法,我想替换所有连续数字其 数学 形式不符合逻辑 数学 但我的算法会知道并将其转换为原始形式。
假设我有字符串:
string input = "732183900000000000002389288888888888888";
你看到了吗0000000000和8888888888888是主要的连续重复.
现在我想将它们转换为:
//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 的组
- 没有前缀破折号
- 无后缀破折号
- 没有双破折号(推测)
这是一个相当高效的 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
13-2
1-23
1-22-33-44-5*5-12345