zoukankan      html  css  js  c++  java
  • 算法实例(一): 游程算法

    都说算法是程序员的内功,在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

                 

  • 相关阅读:
    gevent实现基于epoll和协程的服务器
    用greenlet实现协程消费者生产者
    More is better(MST)(求无向图中最大集合元素个数)
    小希的迷宫(MST单棵树判断法则)
    畅通工程再续(MST)
    畅通工程再续
    畅通工程
    还是畅通工程(MST)
    Minimum Inversion Number
    Who Gets the Most Candies?(线段树 + 反素数 )
  • 原文地址:https://www.cnblogs.com/markj/p/5726392.html
Copyright © 2011-2022 走看看