这是最初的问题:https://www.geeksforgeeks.org/run-length-encoding/
给定输入字符串,编写一个函数,该函数返回输入字符串的运行长度编码字符串。例如,如果输入字符串是“wwwwaaadexxxxxx”,那么函数应该返回“w4a3d1e1x6”。
我所做的唯一改变是,如果字符出现一次,就没有必要在字母之后打印1。
请复习一下性能。
using System;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace StringQuestions
{
///
/// https://www.geeksforgeeks.org/run-length-encoding/
///
[TestClass]
public class RunLengthEncoding
{
[TestMethod]
public void RunLengthEncodingTest()
{
string str = "wwwwaaadexxxxxxywww";
string expected = "w4a3dex6yw3";
Assert.AreEqual(expected, RLE.Encode(str));
}
}
public class RLE
{
public static string Encode(string str)
{
str = str.ToLower();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
int counter = 1;
if (!char.IsLetter(str[i]))
{
throw new ArgumentException("string should contains only letters");
}
while (i < str.Length - 1 && str[i] == str[i + 1])
{
counter++;
i++;
}
if (counter == 1)
{
stringBuilder.Append(str[i]);
}
else
{
stringBuilder.Append(str[i]);
stringBuilder.Append(counter);
}
}
return stringBuilder.ToString();
}
}
}发布于 2019-07-04 02:40:00
我注意到一件事。您正在修改循环内的循环计数器,以运行另一个循环。这是大型项目中创建未见bug的一种方式。通过跟踪前面的字符,只使用一个循环就可以很容易地对其进行编码。
您的捕获字符串除了字母之外还有其他字符,但忽略了空字符串和空字符串。
以下是修改后的代码的一种方式:
static string Encode(string input)
{
if (input == null || input.Length == 0)
{
ArgErrHandler("String must have at least one letter.");
}
if (input.Any(x => !char.IsLetter(x)))
{
ArgErrHandler("String must have only letters.");
}
if (input.Length == 2 || input.Length == 1)
{
return (input.Length == 1 || input[0] != input[1]) ? input : $"{input[0]}{2}";
}
int limit = input.Length - 1;
int counter = 1;
StringBuilder sb = new StringBuilder();
int i = 1;
char prev = '\0';
do
{
prev = input[i - 1];
if (input[i] == prev)
{
++counter;
}
else
{
if (counter > 1)
{
sb.Append($"{prev}{counter}");
}
else
{
sb.Append(prev);
}
prev = input[i];
counter = 1;
}
} while (++i < limit);
if (input[i] == prev)
{
++counter;
sb.Append($"{prev}{counter}");
}
else
{
if (counter > 1)
{
sb.Append($"{prev}{counter}{input[i]}");
}
else
{
sb.Append($"{prev}{input[i]}");
}
}
return $"{sb}";
}
private static void ArgErrHandler(string message)
{
throw new ArgumentException(message);
}https://codereview.stackexchange.com/questions/223450
复制相似问题