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

                 

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/markj/p/5726392.html
Copyright © 2011-2022 走看看