/*

* 题目:压缩字符串。如“abbcccddddeef”,压缩成“a1b2c3d4e2f1”

* 解题: 这个题目也是面试常见的题目。看似很简单,其实暗藏杀机。一般的想法就是,一边遍历,一边计数,然后将字符和计数器组合成新的字符串。

* 这个想法没有错,但是结果有漏洞。

* 等你写好算法,一般面试官会问以下两个问题中的一个:

* 1:按照你的算法,“11111111111122222222222”(十二个1和十一个2)压缩的结果是什么?

* 2: 按照你的算法, 压缩结果为“a101b3”的字符串,它原来是什么样的?

*

* 先回答第一个问题:很多人理所当然的回答就是:112211。下一个问题就来了:请问字符串“1221”压缩的结果是多少?

* 也是112211,这回你傻眼了吧?

* 第二个问题:按照原来的思路,“a101b3”原来的字符串应该是101个a,3个b。但是面试官会说:“a101b3”我可以理解为1个a,1个0,3个b。

*

* 以上两个问题都是出现在 压缩结果的二义性。既然有压缩算法,就会有解压算法,如果压缩结果有二义性,那就没办法解压得到唯一的字符串,那压缩算法就没有意义了。

*

* 好吧,现在你就得绞尽脑汁的改善你的算法,等你好不容易觉得改对了,面试管不置可否。他会说:你能不能再针对你的压缩算法,写一个对应的解压算法?

* 承蒙面试管看得起你,你就等着死伤千万细胞把。因为后面还有后着。

*

* 等你把解压算法写好了,他就会去验证你的算法,这里就是黑盒测试了,给你一个字符串,先让你压缩,再让你解压,看看结果还是不是原来的样子。

* 如果是,有可能是侥幸的,他会在尝试其他的字符串,如果能一直保持一致,恭喜你。如果不行,你就慢慢的找原因吧...

*

* 一场面试下来,会让你晚上回去做噩梦的...

*

* 有一个可行的方案,但不知道是不是最佳的,比如说11个a,按十进制压缩的话,应该压成a9a2,11个1,因该压成1912,这样解压的时候就没有二义性了。

*/

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LearnCompressString

{

class Program

{

static void Main(string[] args)

{

string str = "abbcccddddfffffffffffffffffffffg01122233333333333333))))*(&^&*^&*****#¥……—--";

Console.WriteLine(str);

string result = CompressString(str);

Console.WriteLine(result);

result = ExtractString(result);

Console.WriteLine(result);

Console.ReadKey();

}

//字符串压缩

public static string CompressString(string str)

{

const int iMaxCount = 9;//常量,表示多少进制,如十进制的 a9 表示9个a, 十六进制的af表示15个a。这里用十进制。

StringBuilder stringBuilder = new StringBuilder();

int countChar = 1;//计数器

str = str.Trim() + " ";//为了防止在下面的循环中溢出,我在原来的字符串末尾加上了一个空格。

for (int i = 0; i < str.Length - 1; i++)

{

if (str[i + 1] == str[i])//如果连续的字符相等

{

countChar++;//计数器加一

if (countChar > iMaxCount)//如果计数器大于9,压入stringBuilder,比如,连续十个a,应该表示为:a9a1,而不是a10

{

stringBuilder.Append(str[i]);

stringBuilder.Append(iMaxCount.ToString());

countChar = 1;

}

continue;

}

else//如果不等,就将当前的字符和计数压入stringBuilder。

{

stringBuilder.Append(str[i]);

stringBuilder.Append(countChar.ToString());

countChar = 1;

}

}

return stringBuilder.ToString();

}

//字符串解压

public static string ExtractString(string str)

{

StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < str.Length; i = i + 2)

{

int countChar=(int)str[i+1]-(int)'0';//将记录字符字数的字符,如a9中的9转化为整型的9。

for (int j = 0; j < countChar; j++)

stringBuilder.Append(str[i]);

}

return stringBuilder.ToString();

}

}

}

原文转自:http://www.cnblogs.com/txw1958/archive/2013/01/11/csharp-array.html
原作者为 方倍工作室。请尊重原作者版权

C# 压缩与解压字符串(面试题)的更多相关文章

  1. python用模块zlib压缩与解压字符串和文件的方法

    摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...

  2. python使用zlib实现压缩与解压字符串

    命令 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompressobj 案例 >& ...

  3. PAT 乙级 1078 字符串压缩与解压 (20)

    文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...

  4. PAT 1078 字符串压缩与解压(20)(代码+思路)

    1078 字符串压缩与解压(20 分) 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表 ...

  5. PAT 1078 字符串压缩与解压

    https://pintia.cn/problem-sets/994805260223102976/problems/994805262018265088 文本压缩有很多种方法,这里我们只考虑最简单的 ...

  6. PAT(B) 1078 字符串压缩与解压(Java)

    题目链接:1078 字符串压缩与解压 (20 point(s)) 题目描述 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 ...

  7. PAT Basic 1078 字符串压缩与解压 (20 分)

    文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如  ...

  8. 1078 字符串压缩与解压 (20分)C语言

    文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...

  9. P1078 字符串压缩与解压

    P1078 字符串压缩与解压 转跳点:

随机推荐

  1. oops call trace 解析

    Call Trace: [  221.634988]  [<ffffffff8103fbc7>] ? kmld_pte_lookup+0x17/0x60 [  221.635016]  [ ...

  2. Linux下ejabberd开机自启(CentOS)

    废话少说,Linux下开机自启动Ejabberd步骤如下: 1.从ejabberd安装目录的bin目录拷贝ejabberd.init到/etc/init.d/ejabberd下 [root@imser ...

  3. java报表工具finereport常用函数的用法总结(数组函数)

    ADD2ARRAY ADDARRAY(array,insertArray, start):在数组第start个位置插入insertArray中的所有元素,再返回该数组. 示例: ADDARRAY([3 ...

  4. javaScript事件(五)事件类型之鼠标事件

    一.事件 二.事件流 以上内容见:javaScript事件(一)事件流 三.事件处理程序 四.IE事件处理程序 以上内容见javaScript事件(二)事件处理程序 五.事件对象 以上内容见javaS ...

  5. 【CSS】使用CSS选择器

    CCS选择器的作用是找出某类元素.以便使我们使用style元素或者外部样式表对这类元素设置样式. 1.使用CSS基本选择器 有些选择器使用起来非常简单,我们把这部分选择器称为基本选择器(basic s ...

  6. POJ 3608 Bridge Across Islands --凸包间距离,旋转卡壳

    题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..我直接默认顺时针给的点居然A ...

  7. KEngine:Unity3D资源的打包、加载、调试监控

    资源模块做什么? 资源模块——ResourceModule,是KEngine中最核心的模块,其他模块基本或多或少的对它有依赖,它主要的功能是:资源打包.路径定义.资源管理.资源调试. 资源模块对Uni ...

  8. css相关问题

    display:none和visibility:hidden的区别? 前几天遇到的这个问题,表格布局:::::display:none 隐藏对应的元素,在文档布局中不再给它分配空间,它各边的元素会合拢 ...

  9. JQuery常用方法(均实践过)

    1,使用jquery修改html元素的值 a,修改form的action的值(即修改html的属性值) 这个可以扩展为修改html元素的属性值的方法,使用的$("#id").att ...

  10. Regression analysis

    Source: http://wenku.baidu.com/link?url=9KrZhWmkIDHrqNHiXCGfkJVQWGFKOzaeiB7SslSdW_JnXCkVHsHsXJyvGbDv ...