挑战介绍
实现一个算法来压缩一个字符串。压缩的要求如下:
1需要判断压缩能不能节省空间,仅在压缩后字符串比原字符串长度更短时进行压缩。 2压缩的格式是将连续相同字符替换为字符+数字形式,例如 "AAABCCDDDD" 变为 "A3BC2D4"。
本次挑战中,你需要在 compress_str.py 文件中补充函数 compress 的空缺部分。
1compress 函数接受一个参数,string 用于指定传入的字符串; 2compress 函数输出一个字符串。
你需要补充 compress 函数,使 compress 函数可以对传入的 string 字符串进行压缩。要求如下:
1判断传入的字符串是否需要进行压缩,如果不需要压缩,返回原字符串; 2如果需要压缩,返回压缩后的字符串; 3如果传入的字符串是 None 或者空字符串,返回 None 或者空字符串。
1class CompressString(object): 2 3 def compress(self, string): 4 if string is None or not string: 5 return string 6 result = '' 7 prev_char = string[0] 8 count = 0 9 for char in string: 10 if char == prev_char: 11 count += 1 12 else: 13 result += self._calc_partial_result(prev_char, count) 14 prev_char = char 15 count = 1 16 result += self._calc_partial_result(prev_char, count) 17 return result if len(result) < len(string) else string 18 19 def _calc_partial_result(self, prev_char, count): 20 return prev_char + (str(count) if count > 1 else '')
string is None or not string 依旧判断是否为空
判断是否需要压缩
先定义一个prev_char赋值string第一个字符
通过循环对比string里的字符
判断char等于string[0]来计数
每一个相等 count+1
当不相等遇到下一个字符时便调用_calc_partial_result函数来返回之前压缩的值
比如aaaaa压缩成a5
下一个字符便重复之前的循环
最后通过对比len(result) < len(string) 压缩后和原字符串的长度来确定是否需要压缩
