/*

* 题目:压缩字符串。如“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. python中strip,lstrip,rstrip简介

    一.起因 今天在做角色控制中,有一个地方用到rstrip,判断用户请求的url是否与数据库对应可用权限中url相符. if request.path == x.url or request.path. ...

  2. C++/C#互调步骤

    一.C#调用C++ dll步骤(只能导出方法):  * 1. c++建立空项目->源文件文件夹中添加cpp文件和函数  * 2. c++属性设置中,配置类型设置为动态库dll,公共语言运行时支持 ...

  3. 【2016-10-13】【坚持学习】【Day4】【模板方法模式】

    今天学习模板方法模式 例子代码; 模板抽象类,定义了一套流程,有一些方法已经实现,有一些抽象方法需要继承它的子类实现 abstract class DataViewer { //抽象方法:获取数据 p ...

  4. 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)

    9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源 ...

  5. Adobe Air移动开发本人体会

    采用FLASH BUILD4.6开发 1.没有mx:Canvas了,s:BordContainer未经手机优化,也不敢用,只有用s:Group 2.好多控件没有了,如DropDownList,Prog ...

  6. jsp的九大内置对象和四大作用域

    定义:可以不加声明就在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量? JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):? 1.request对象(作用域)? 客户 ...

  7. java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式

    反射: JAVA语言的反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调 ...

  8. Json 基于jQuery+JSON的省市联动效果

    helloweba.com 作者:月光光 时间:2012-09-12 21:57 标签: jQuery  JSON  Ajax  省市联动     省市区联动下拉效果在WEB中应用非常广泛,尤其在一些 ...

  9. JS的递归与TCO尾调用优化

    转自:https://segmentfault.com/a/1190000004018047 这两天搜了下JS递归的相关文章, 觉得这篇文章很不错, 就顺手翻译了下,也算给自己做个笔记,题目是我自己加 ...

  10. Java 日志性能优化

    1. 选择合理的日志级别.合理控制日志内容 2. 控制日志的输出内容和格式 logger.debug("Entry number: " + i + " is " ...