題目描述:
給定一組字符,使用[原地算法]將其壓縮。
壓縮后的長度必須始終小于或等于原數(shù)組長度。
數(shù)組的每個(gè)元素應(yīng)該是長度為1 的**字符**(不是 int 整數(shù)類型)。
在完成[原地]**修改輸入數(shù)組**后,返回?cái)?shù)組的新長度。
示例
輸入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
輸出:
返回4,輸入數(shù)組的前4個(gè)字符應(yīng)該是:["a","b","1","2"]。
說明:
由于字符"a"不重復(fù),所以不會(huì)被壓縮。"bbbbbbbbbbbb"被“b12”替代。
注意每個(gè)數(shù)字在數(shù)組中都有它自己的位置。
分析
主要需要注意幾種情況:
1、若字符出現(xiàn)變化,需要判斷前一個(gè)字符的次數(shù)是否大于1,若大于,則需要將次數(shù)追加到數(shù)組內(nèi)。
2、若最后一個(gè)字符與前一個(gè)字符相同,需要將次數(shù)追加到數(shù)組內(nèi)。
3、追加次數(shù)時(shí),需要注意按字符逐次追加,在這里最開始用fmt.Sprintf做了轉(zhuǎn)換,后又調(diào)整為原始的處理邏輯。
實(shí)現(xiàn)
func compress(chars []byte) int {
var chr byte
var num int
j := 0
setchars := func(value byte) {
chars[j] = value
j++
}
setnums := func(value int) {
var ml []int
for {
rem := value % 10
value = value / 10
ml = append(ml, rem)
if value <= 0 {
break
}
}
for x := len(ml) - 1; x >= 0; x-- {
setchars(byte(ml[x] + 48))
}
}
for i, c := range chars {
if i == 0 || chr != c {
if num > 1 {
setnums(num)
}
setchars(c)
chr = c
num = 1
} else if chr == c {
num++
if i == len(chars)-1 {
setnums(num)
}
}
}
return j
}
效果

image.png
內(nèi)存占用比較高,不過僅練習(xí)下算法還是足夠了的。