壓縮字符串

題目描述:

給定一組字符,使用[原地算法]將其壓縮。

壓縮后的長度必須始終小于或等于原數(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í)下算法還是足夠了的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)容 給定一組字符,使用原地算法將其壓縮。 壓縮后的長度必須始終小于或等于原數(shù)組長度。 數(shù)組的每個(gè)元素應(yīng)該是長度為...
    吃飯用盤裝閱讀 495評(píng)論 0 0
  • 443. 壓縮字符串給定一組字符,使用原地算法將其壓縮。壓縮后的長度必須始終小于或等于原數(shù)組長度。數(shù)組的每個(gè)元素應(yīng)...
    杏仁小核桃閱讀 396評(píng)論 0 2
  • 可以看一下我的Github項(xiàng)目,使用項(xiàng)目中的lua_zlib.h文件壓縮lua字符串。 使用 我使用的開發(fā)環(huán)境是c...
    明天不用上課閱讀 8,842評(píng)論 0 1
  • 可以看一下我的Github項(xiàng)目,使用封裝zlib庫的ZLibString類進(jìn)行壓縮C++字符串。 使用將ZLibS...
    明天不用上課閱讀 6,380評(píng)論 0 3
  • 是一個(gè)遞歸問題,根據(jù)討論區(qū)提示,分為三種情況取最短。來自:https://hihocoder.com/discus...
    wshxj123閱讀 549評(píng)論 0 0

友情鏈接更多精彩內(nèi)容