q:五筆的編碼範圍是a ~ y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成乙個陣列如下:
a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy
其中a的index為0,aa的index為1,aaa的index為2,以此類推。
1)編寫乙個函式,輸入是任意乙個編碼,比如baca,輸出這個編碼對應的index;
2)編寫乙個函式,輸入是任意乙個index,比如12345,輸出這個index對應的編碼。
a:初看一下,編碼並不是按照數字大小進行,而是按照字典序進行排序。首先通過列舉一些例子找找規律。
index[a]=0,index[aa]=1,index[aaa]=2,index[aaaa]=3,前四個字串的規律是strlen(str)-1。
我們再看已知index[a]求index[b]。a,aa,aaaa,aaab,…,ayyy。其中aa->ay(25個數),aaa->ayyy(25*25個數),aaaa->ayyy(25*25*25個數),這樣index[b]=index[a]+25^3+25^2+25+1
再看已知index[aa]求index[ab]。aa,aaa,aaaa,aaab,…,aayy。其中aaa->aay(25個數),aaaa->aayy(25*25個數),這樣index[ab]=index[aa]+25^2+25+1
再看已知index[aaa]求index[aab]。aaa,aaaa,…,aaay。其中aaaa->aaay(25個數)。這樣index[aab]=index[aaa]+25+1
再看已知index[aaaa]求index[aaab]。index[aaab]=index[aaaa]+1。
這樣我們就可以將上述因子放在乙個陣列裡。factor=
我們以bdce為例說明。
對字串從左到右遍歷,首先發現的是b,b距離a的相對index=factor[0],而index[a]=0,所以到達b是factor[0];再看第二個字元d,bd距離ba的長度為factor[1]*(b-a),而ba距離b的長度又為1;所以到達bd是1+factor[0]+factor[1]*(b-a);再看第三個字元c,bdc到bda的長度為factor[2]*(c-a),而bda距離bd的長度又為1,所以到達bdc是1+1+factor[0]+factor[1]*(b-a)+factor[2]*(c-a);最後再看e,bdce到bdca的長度為factor[3]*(e-a),而bdca距離bdc的長度又為1,所以到達dbce是1+1+1+factor[0]+factor[1]*(b-a)+factor[2]*(c-a)。所以編碼就出來了。
1
2
3
4
5
6
7
8
9
10
11
int
factor=;
int
encode(
char
*str)
return
index;
}
對於第二個問題,解碼就是編碼的逆過程,也是順序求字串的1234個字元就行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char
* decode(
int
index)
str[i]=
'\0'
;
return
str;
}
五筆的編碼和解碼
q 五筆的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy 其中a的index為0,aa的index為1,aaa的inde...
五筆的字典序編碼與解碼
假定一種編碼的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把該編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy 其中a的index為0,aa的index為1,aaa的inde...
演算法練習 五筆編碼
五筆的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy,其中a的index為0,aa的index為1,aaa的index為...