算法实例(一): 游程算法

都说算法是程序员的内功,在3年码农生涯中,虽然日常也会看一些算法题(自己也会写写代码去实现)但毕竟没有好好整理,希望能督促在自己写博客的时候可以好好整理下。

此篇随笔背景:是因为看了一篇公众号的文章)URL:http://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650560059&idx=1&sn=8e9285e79a19c84ec3667a595533d30e&scene=4#wechat_redirect)

                    就想用C#实现一下这篇文章里的内容。

 

游程编码图示:

简单来说,就是缩减传输流的数据长度(在压缩图片里比较常用)。

---------------------------------------------我是分割线(下面上实例)------------------------

 

 public static string EnCode(string str)
        {
            var j = 0;
            //将字符串拆解成char[]
            var chars = str.ToCharArray().ToList();
            var currentChar=chars[0];
            var stringBuilder = new StringBuilder(); 
            foreach (var item in chars)
            {
                //当获取到的char和当前char[]索引的char相同则计数+1
                if (currentChar == item)
                {
                    j++;
                }
                else
                {
                    stringBuilder.Append(currentChar.ToString()+j);
                    currentChar = item;
                    j = 1;
                }
            }
            return stringBuilder.ToString();
        }

传入:"sssssssssssbbbeeeaaavcefffppoo"

得出的结果:

大家可以发现:当数量为1的元素在其身后也会加上一个数字1,如果当一串字符串内的元素都为单个元素时,不但没有减少反而会增长实际的传输数据所以可以修改代码如下:

 stringBuilder.Append(currentChar.ToString() + (j > 1 ? j.ToString() : string.Empty));

传入:"sssssssssssbbbeeeaaavcefffppoo"

得出的结果:

---------------------------------------------我是分割线(上述EnCode实例。下面将是DeCode实例)------------------------

  public static string InterDeCode(string str)
        {
            var chars = str.ToCharArray().ToList();
            var stringBuilder = new StringBuilder();
            var isNumber = false;
            var count = "";
            var currentChar = chars[0];
            foreach (var item in chars)
            {
                //这里需要判断char 是否为数字
                if (char.IsNumber(item))
                {
                    count = item.ToString();
                    //如果当前char为数字+之前的char 也是数字的话,则直接相加,是为了应对"a123b" 这种情况
                    if (isNumber)
                    {
                        count += item.ToString();
                    }
                    isNumber = true;
                }
                else
                {
                    isNumber = false;
                    var index = string.IsNullOrEmpty(count) ? 0 : Convert.ToInt32(count)-1;
                    
                    if (currentChar != item)
                    {
                        stringBuilder.Append(currentChar);
                    }

                    for (int i = 0; i < index; i++)
                    {
                        stringBuilder.Append(currentChar);
                    }

                    count = "";
                    currentChar = item;
                }
            }

            return stringBuilder.ToString();
        }

得出的结果:

 

好啦,代码都写在上面了,这些都不是最优的代码。大家有意见尽管支出。

下载源码:https://files.cnblogs.com/files/markj/%E6%B8%B8%E7%A8%8B%E7%AE%97%E6%B3%95.rar

 

             

 

posted @ 2016-08-01 16:49  Mark J  阅读(425)  评论(0编辑  收藏  举报