字符串压缩
题目
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为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 }
small_lei_it 技术无止境,追求更高。