字符串压缩

题目

给定一组字符,使用原地算法将其压缩。

压缩后的长度必须始终小于或等于原数组长度。

数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。

在完成原地修改输入数组后,返回数组的新长度。

解题思路

方法一:双指针
直觉:

我们使用两个指针 read 和 write 分别标记读和写的位置。读写操作均从左到右进行:读入连续的一串字符,然后将压缩版写到数组中。最终,write 将指向输出答案的结尾。

算法:

保留指针 anchor,指向当前读到连续字符串的起始位置。

从左到右进行读取。当读到最后一个字符,或者下一个下一个字符与当前不同时,则到达连续区块的结尾。

当我们到达连续区块的结尾时,就从 write 写入压缩的结果。chars[anchor] 为字符,read - anchor + 1 (若大于 1)为长度。

代码

func compress(chars []byte) int {
	w, anchor := 0, 0
	for r := 0; r < len(chars); r++ {
		if r+1 == len(chars) || chars[r+1] != chars[r] {
			chars[w] = chars[anchor]
			w++
			if r > anchor {
				num := strconv.Itoa(r + 1 - anchor)
				for _, val := range num {
					chars[w] = byte(val)
					w++
				}
			}
			anchor = r + 1
		}
	}
	return w
}

  

posted @ 2021-03-10 16:43  small_lei_it  阅读(378)  评论(0编辑  收藏  举报