對論壇乙個字串編碼問題的回答

2021-05-27 00:51:54 字數 1456 閱讀 8205

對論壇乙個字串編碼問題的回答

horin | [email protected]

昨天晚上更新一篇部落格,順便看見論壇乙個帖子:其問題如下:例如輸入字串:aaabbbbcccccc,要求輸出:a3b4c6.

正好這兩天有空,也覺得問題簡單,就分析如下:

首先是需求分析,貼主的問題顯然描述不清晰。

1,對字串進行編碼後,是否需要進行可逆的解碼?

2,字串輸入集是英文本母?還是 ascii 字元?是否有漢字等多位元組字?

假設字串需要可逆解碼,如果輸入是英文本母,則 a123 是無歧義的;如果是 ascii 字元,則 a123 是有歧義的(a222 或者 123個連續a)。為簡化問題,假設是沒有漢字的純 ascii 字串(當然包括了字母集)。

接著是設計。對 ascii 字串進行編碼,因為字元的重複次數未定,為了節約空間,定義編碼後的資料結構為:

字元/byte + 字元重複數(最大255)/byte

對連續 260 個 a 的字串,編碼後記憶體資料為:'a',0xff,'a',0x05,也就是占用 4 位元組(255個a,5個a);在視覺化輸出時可以處理為 a:260。

最後就是**實現和單元測試。對這個簡單的字串問題,用標準庫就足夠了,**如下:

//---------------------------- code begin ----------------------------

#include #include #include void encode(char* dst, char* src)

} *pd = '\0';

}int main(void) ; // 最長為300的字串

::memset(src, 'a', 260); // 連續260個a

char* p = src;

p += 260;

::memset(p, 'b', 40); // 接著連續40個b

size_t len = 300*2+1; // 輸出字串長度為輸入字串長度的 2 倍

char* dst = new char[len];

::memset(dst, 0, len);

encode(dst, src);

// 把編碼後的記憶體資料列印出來, 很容易就可以改為解碼演算法.

printf ("after encode:");

p = dst;

while(*p && *(p+1))

delete dst;

return 0;

}//---------------------------- code end ----------------------------

測試輸出結果如下:

after encode:a:255;a:5;b:40;

這和輸入的字元數是一致的,測試正確。

乙個字串編碼問題的程式解決

原題 描述 為了最大程度地節約儲存空間,經常需要把資訊進行編碼。一種很有效的編碼方法是用數字來表示一串字元。假設這些字串都是由不重複的英文小寫字母組成的,且每個字串中的英文本母都是從小到大排列的。這個編碼系統按照如下的方式工作 字串是按照長度從小到大的順序排列的 長度相同的字串,是按照字典需排列的 ...

乙個字串演算法問題

已知一組數字 21,25,11,32,12,35,55,77,66 要求按以下規則進行排序 第乙個數最大,第二個數最小,第三個數是剩下中的最大的,第四個數是剩下中的最小的,依此類推,請設計乙個字元介面的程式解決之 c codes as below class program console.read...

乙個字串是否包含另乙個字串的問題

string s1 2,3,4,5,11,string s2 1,2個字串s1和s2,我用什麼方法判斷s2在不在s1裡呢,而不是把s1裡的 11,當成s2 using system using system.text.regularexpressions class test 在這個程式中,s1 和...