C# 压缩与解压字符串(面试题)
/*
* 题目:压缩字符串。如“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();
}
}
}
C# 压缩与解压字符串(面试题)的更多相关文章
- python用模块zlib压缩与解压字符串和文件的方法
摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...
- python使用zlib实现压缩与解压字符串
命令 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompressobj 案例 >& ...
- PAT 乙级 1078 字符串压缩与解压 (20)
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...
- PAT 1078 字符串压缩与解压(20)(代码+思路)
1078 字符串压缩与解压(20 分) 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表 ...
- PAT 1078 字符串压缩与解压
https://pintia.cn/problem-sets/994805260223102976/problems/994805262018265088 文本压缩有很多种方法,这里我们只考虑最简单的 ...
- PAT(B) 1078 字符串压缩与解压(Java)
题目链接:1078 字符串压缩与解压 (20 point(s)) 题目描述 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 ...
- PAT Basic 1078 字符串压缩与解压 (20 分)
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...
- 1078 字符串压缩与解压 (20分)C语言
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...
- P1078 字符串压缩与解压
P1078 字符串压缩与解压 转跳点:
随机推荐
- hadoop2.6.2分布式环境搭建
1.准备三台机器,机器名是:master.slave01.slave02 1.1 最小化安装centos6.5 1.2 安装ssh,yum -y install openssh-clients(这一步 ...
- emacs 新手笔记(一) —— 阅读【emacs tutorial】
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 [emacs tutorial]是熟悉 emacs 的入门资料.一共几十个命令,不需硬记,勤练即可. 翻页命 ...
- TCMalloc 对MYSQL 性能 优化的分析
虽然经过研究发现TCMalloc不适合我们现有的游戏框架,但意外收获发现TCMalloc可以大幅度提高MYSQL 性能及内存占用,这里给出配置及测试的结果: 1.配置 关于TCMalloc的安装,在& ...
- c++形参改变实参(对指针的理解
这几天搞逻辑比较晕,居然把指针的概念都混淆了. eg:int *p;//当然不对指针初始化在有些编译器是通不过编译的,比如VS(尤其是选中了SDL) 指针p是一个对象,定义开始没有分配了内存空间,只是 ...
- SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)(转)
使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...
- [No000053]我25岁了,是应该继续挣钱,还是选择自己的爱好?--正好庆祝自己25岁生日
你所问的问题正是问题所在.停止做出重大决策,专注于缩小你想到达的地位与你之间的差距. 成功的生活并非由简单而鲜明的决定组成,它们更像这幅图: 但悲伤的是,太多人的状态类似于这幅图: 我知道这听上去很显 ...
- 转:windows下命令行工具
转自: http://www.cnblogs.com/haochuang/p/5593411.html Windows下CMD不好用,远没有Linux,或者一些SSH工具用起来方便.其实Windows ...
- Linux—C内存管理
程序(可执行文件)存储结构与进程存储结构: 查看文件基本情况:file fileName.查看文件存储情况:size fileName(代码区text segment.全局初始化/静态数据区data ...
- oracle 事务总结
用了这么长时间的oracle,该总结一下所得了 1,事务 事务用于保证数据的一致性, 它由一组相关的 dml语句组成, 该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败,比 ...
- MySQL的mysql_insert_id和LAST_INSERT_ID(转)
本文介绍的是mysql中last_insert_id和mysql_insert_id的区别 1 mysql_insert_id 一.PHP获取MYSQL新插入数据的ID mysql_insert_id ...