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

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

得出的结果:

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

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

时间: 2024-11-09 00:35:47

算法实例(一): 游程算法的相关文章

Floyd算法实例

~ 当k=0时,我们关注的是邻接矩阵的第0行和第0列,即顶点0的入边和出边: 考察矩阵中其他元素,如果元素D[i][j]向第0行和第0列的投影D[0][j]和D[i][0]都有值,就说明原图中从 i 到 j 存在一条经过顶点0的有向路径 i -> 0 -> j, 这样的路径包含的边数不会超过2,如果其权值小于D[i][j],则应用这个权值更新D[i][j],表明图中有向路径 i -> 0 -> j 相比原有路径更短. k=1.2时情况类似~ OK哒,哈哈~ Floyd算法实例,布布

MATLAB工具箱及算法实例

核心函数: (1) function[pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 [输出参数] pop--生成的初始种群 [输入参数] num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options--选择编码形式(浮点编码或是二进制编码)[precisionF_or_B],如precision--变量进行二进制编码时指定的

javascript常用经典算法实例详解

javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与使用技巧,需要的朋友可以参考下 本文实例讲述了javascript常用算法.分享给大家供大家参考,具体如下: 入门级算法-线性查找-时间复杂度O(n)--相当于算法界中的HelloWorld ? 1 2 3 4 5 6 7 8 9 10 //线性搜索(入门HelloWorld) //A为数组,x为要

算法实例_线性表 By:比方

算法实例_线性表 By:比方 什么是线性表? 从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列. 线性表的结构和特点 1.              仅有一个开始节点x1,没有直接前趋节点,有妾只有一个直接后续节点x2: 2.              仅有一个终结节点xn,仅有一个前趋节点xn-1; 3.              对于同一个线性表,其中没一个数据的元素,都必须具备相同的数据结构类型, 且没一个元素

php短网址算法实例代码分享

php实现的短网址算法,理论上支持1,073,741,824个短网址. 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,824个短网址.当然,你还可以记录更详细的信息,如访问记录,创建时间等.如果真不够用了,还可以删掉很久不用的. function shorturl($input) { $base32 = array ( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p

斐波那契递归和非递归俩种算法实例

package testcase; /** * * @decription \ \\_ .---(') o( )_-\_ 斐波那契递归和非递归俩种算法实例 * @author bjliuzezhou * @date 2016年2月23日 */ public class TypicalArithmetic_01 { public static void main(String[] args) { System.out.println(fn(6)); System.out.println(noRec

算法实例_链表结构 By:比方

前一章,我们说到了顺序表结构,而顺序表也存在一些的缺点. 在插入或者删除节点的时候,需要移动的数据比较大,如果顺序表结构比较大,有时候比较难以分配足够的连续存储空间,可能会导致内存分配失败,而导致无法存储. 而今天我们讲解的链表结构则可以很好的解决这个问题,链表的结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元. 一.什么是链表结构? a)         我们用head来表示头节点. b)         数据部分保存的是存储的数据,地址地方指向下一个数据的起始部分,依次向

【机器学习】k-近邻算法以及算法实例

机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 ---3.设计算法分析数据 ---4.测试算法 一.kNN算法的工作原理 官方解释:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最

C#彩色图片灰度化算法实例

本文实例讲述了C#彩色图片灰度化实现方法.分享给大家供大家参考.具体方法如下: 主要功能代码如下: 代码如下: public static Bitmap MakeGrayscale(Bitmap original) { //create a blank bitmap the same size as original Bitmap newBitmap = new Bitmap(original.Width, original.Height); //get a graphics object fr

【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 .该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型.粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解.