對論壇乙個字串編碼問題的回答
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 和...