首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的游程编码

C#中的游程编码
EN

Code Review用户
提问于 2019-07-03 21:29:32
回答 1查看 2K关注 0票数 2

这是最初的问题:https://www.geeksforgeeks.org/run-length-encoding/

给定输入字符串,编写一个函数,该函数返回输入字符串的运行长度编码字符串。例如,如果输入字符串是“wwwwaaadexxxxxx”,那么函数应该返回“w4a3d1e1x6”。

我所做的唯一改变是,如果字符出现一次,就没有必要在字母之后打印1。

请复习一下性能。

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-07-04 02:40:00

我注意到一件事。您正在修改循环内的循环计数器,以运行另一个循环。这是大型项目中创建未见bug的一种方式。通过跟踪前面的字符,只使用一个循环就可以很容易地对其进行编码。

您的捕获字符串除了字母之外还有其他字符,但忽略了空字符串和空字符串。

以下是修改后的代码的一种方式:

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/223450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档