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