日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

443. 压缩字符串

發布時間:2023/11/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 443. 压缩字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

443. 壓縮字符串

給你一個字符數組 chars ,請使用下述算法壓縮:

從一個空字符串 s 開始。對于 chars 中的每組 連續重復字符 :

如果這一組長度為 1 ,則將字符追加到 s 中。
否則,需要向 s 追加字符,后跟這一組的長度。
壓縮后得到的字符串 s 不應該直接返回 ,需要轉儲到字符數組 chars 中。需要注意的是,如果組長度為 10 或 10 以上,則在 chars 數組中會被拆分為多個字符。

請在 修改完輸入數組后 ,返回該數組的新長度。

你必須設計并實現一個只使用常量額外空間的算法來解決此問題。

示例 1:

輸入:chars = [“a”,“a”,“b”,“b”,“c”,“c”,“c”]
輸出:返回 6 ,輸入數組的前 6 個字符應該是:[“a”,“2”,“b”,“2”,“c”,“3”]
解釋:
“aa” 被 “a2” 替代。“bb” 被 “b2” 替代。“ccc” 被 “c3” 替代。
示例 2:

輸入:chars = [“a”]
輸出:返回 1 ,輸入數組的前 1 個字符應該是:[“a”]
解釋:
沒有任何字符串被替代。
示例 3:

輸入:chars = [“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
輸出:返回 4 ,輸入數組的前 4 個字符應該是:[“a”,“b”,“1”,“2”]。
解釋:
由于字符 “a” 不重復,所以不會被壓縮。“bbbbbbbbbbbb” 被 “b12” 替代。
注意每個數字在數組中都有它自己的位置。

提示:

1 <= chars.length <= 2000
chars[i] 可以是小寫英文字母、大寫英文字母、數字或符號

解題思路

遍歷字符數組,找出連續字符的出現次數

難點在于,我們需要將出現次數切割為字符,重新寫入字符數組中。我們可以維護一個一個寫指針

  • 首先需要將連續字符寫入,如果字符出現的次數大于一的情況下,我們就需要拆分出現次數,寫入數組,每個字符的寫入都將寫指針后移

  • 最后返回寫指針所在的位置

  • 代碼

    class Solution {public int compress(char[] chars) {char pre=chars[0],cnt=1,w=1;for (int i = 1; i < chars.length; i++) {if (chars[i]==pre){cnt++;}else {if(cnt>1){int old=w;while (cnt>0) {chars[w++] = (char)('0'+ cnt%10);cnt/=10;}for (int l=old,r=w-1;l<r;l++,r--){char c=chars[l];chars[l]=chars[r];chars[r]=c;}}cnt=1;pre=chars[i];chars[w++]=pre;}}if(cnt>1){int old=w;while (cnt>0) {chars[w++] = (char)('0'+ cnt%10);cnt/=10;}for (int l=old,r=w-1;l<r;l++,r--){char c=chars[l];chars[l]=chars[r];chars[r]=c;}}return w;} }

    總結

    以上是生活随笔為你收集整理的443. 压缩字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。