
前言
本系列文章为《程序员面试金典》刷题笔记。
题目位置:字符串压缩 题集:程序员面试金典
题目
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
思路
int
count := 1
res :=string(S[0])
从第一个字符开始遍历
for i:=1;i<len(S);i++{
......
每次当前字符和前一个字符比较,只要和上一个不同就保存记录下来,然后计数器重置为1。
if S[i] == S[i-1]{
count ++
}else{
res = res + strconv.Itoa(count) + string(S[i])
count = 1
}
0-2
if len(S)<= 2{
return S
}
完整代码见下一节代码(优化前)
看结果:

go
golang
bytes.Bufferbuffer.Grow()capacity
用法举例:
var buffer bytes.Buffer
buffer.WriteString(hello)
buffer.WriteString(",")
buffer.WriteString(world)
_ = buffer.String()
代码见下一节,优化后。

棒极了,写完提交github睡觉。
代码
优化 Go
func compressString(S string) string {
if len(S)<= 2{
return S
}
count := 1
res :=string(S[0])
for i:=1;i<len(S);i++{
if S[i] == S[i-1]{
count ++
}else{
res = res + strconv.Itoa(count) + string(S[i])
count = 1
}
}
res = res + strconv.Itoa(count)
if len(res) < len(S){
return res
}else{
return S
}
}
优化后 Go
func compressString(S string) string {
if len(S)<= 2{
return S
}
count := 1
var res bytes.Buffer
res.WriteString(string(S[0]))
for i:=1;i<len(S);i++{
if S[i] == S[i-1]{
count ++
}else{
res.WriteString(strconv.Itoa(count))
res.WriteString(string(S[i]))
count = 1
}
}
res.WriteString( strconv.Itoa(count) )
resStr := res.String()
if len(resStr) < len(S){
return resStr
}else{
return S
}
}
本文由博客一文多发平台 OpenWrite 发布!