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 字符串压缩与解压 转跳点:
随机推荐
- glibc-2.15编译error: linker with -z relro support required
./configure --prefix=/usr/local/glibc-2.15 configure: error: you must configure in a separate build ...
- netbeans设置语言
netbeans的界面语言 默认是按系统语言 设的. 想要自己指定的话,加上以下参数就可以了. 中文 --locale zh:CN 英文 --locale en:US 日文 --locale ja:J ...
- 定时器的应用---中断方式---让8个LED灯,左右各4个来回亮
定时器的应用---中断方式---让8个LED灯,左右各4个来回亮 /*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序. ** ...
- linux 进程管理相关内容
简介 当我们运行程序时,Linux会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰.这个特殊的环境就称为进程. 每个 Linux 命令都与系统中 ...
- MMORGP大型游戏设计与开发(客户端架构 part13 of vegine)
一些数据是需要不断改动的,程序不可能因为这些改动而不厌其烦的去改动代码,早期的这种做法就成了程序员们最悲哀的痛苦.自从有了数据管理后,程序的世界逐渐清晰,这些烦恼也不再出现,不过若是要很好的管理数据可 ...
- C#学习笔记-Windows窗体基本功能(Login登录界面)
本菜鸟由于实习工作的原因,不得不快速接触C#语言,刚刚好又要做毕业设计,所以就通过自学的方式一举两得地完成这两件事情. 故此文字记录或代码中的各种文件名之类均是以毕业设计为模版记录的,看着不方便之处请 ...
- 【一周读书】All life is problem solving
书籍:<开放的智力> 采铜是我在知乎关注最早的大V之一,那时我脑里有一大堆疑惑和问题,是他的答案帮助我理清了思绪.我从他身上学习到对书籍的爱好,对思维方法的关注,对智慧的向往.读这本小集子 ...
- HDU 2117 取(2堆)石子游戏【wzf博弈】
题意:威佐夫博弈原型,除了输出先手能不能胜,还要输出先手的第一手选择. 思路:预处理出1000000以内的所有奇异局势.对于每个自然数,其必然是某一个奇异局势的a或者b.故对于一个非奇异局势,必定有一 ...
- HDU2929 Bigger is Better[DP 打印方案 !]
Bigger is Better Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- python日期格式化与绘图
画一个量随着时间变化的曲线是经常会遇到的需求,比如画软件用户数的变化曲线.画随时间变化的曲线主要用到的函数是matplotlib.pyplot.plot_date(date,num).由于其第一个变量 ...