演算法練習 五筆編碼

2021-07-08 22:14:34 字數 2240 閱讀 5225

五筆的編碼範圍是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,以此類推。

* 編寫乙個函式,輸入是任意乙個編碼,比如baca,輸出這個編碼對應的index;

* 編寫乙個函式,輸入是任意乙個index,比如12345,輸出這個index對應的編碼。

題目分析

如果你之前做過另乙個題目,「求字元的所有組合,當輸入的字串中含有相同的字串時,相同的字元交換位置是不同的排列,但是同乙個組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。」 那麼這個題目一出來起碼不會覺得特別無從下手,其實就算沒做過也不會特別無從下手,因為就是窮舉利器嘛(即使寫成漂亮的遞迴,仍然不能擺脫窮舉的命運)。

這裡自然不是為了分析這個遞迴窮舉法(也許之後我會再單獨寫一篇闡述一下下)。所以技巧還是需要一些的。將題目要求的字串排列組合起來,如下圖示

根據排列組合的原理,單獨來看每一位字元其可能的組合都是

先來看最末位,即字串有4位,前3為相同,只有最後一位不同,那麼index = index『+(*p-*p』)。舉個例子

p' 是指向字串aaaa的最後一位a的指標,p是指向字串aaab的最後一位b的指標,那麼aaab的index就等於aaaa的index『加上字元b與字元a的距離(即』b『-』a')

接下來看倒數第二位,即前2位和最後1位相同,只有倒數第2位不同,那麼index = index' +(*p-*p』)*(

p' 是指向字串aaaa的第3位a的指標,p是指向字串aaba的指標,那麼按排列規則,aaaa與aaba之間應該有字串aaab,aaac,aaad...aaay, aab,再加上aaaa自身,這一系列字串正好是乙個完整的

再看第2位,即第1位和最後2位相同,只有第2位不同,那麼

p' 是指向字串aaaa的第3位a的指標,p是指向字串abaa的指標,那麼按排列規則,aaaa與abaa之間應該有字串aaab,aaac,...aaay, aaba...aaby...aaya...aayy,再加上aaaa自身,這一系列字串正好是乙個完整的

最後就是首位了,即第1位不同,後面的3位相同,那麼

p' 是指向字串

aaaa的第3位a的指標,p是指向字串

baaa的指標,那麼按排列規則,aaaa與baaa之間應該有字串aaab,aaac,...aaay, aab,aaba...aaby...ab,aba,abaa,...abyy, ay,aya,ayaa...ayyy,b,ba,baa,再加上aaaa自身,這一系列字串正好是乙個完整的

綜上,mnoq相對於字串a的index應該是

分析完畢。輸入index反向查詢字串正好是將上面的分析過程反過來,這裡不詳細記述。**如下

/*

* 五筆編碼

* * 五筆的編碼範圍是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,以此類推。

* 編寫乙個函式,輸入是任意乙個編碼,比如baca,輸出這個編碼對應的index;

* 編寫乙個函式,輸入是任意乙個index,比如12345,輸出這個index對應的編碼。

*/void wubiindex(const string &input)

; for(int i = 1; i < 4; ++i)

sum[i] = num * (sum[i-1]) + 1;

while(*p)

cout<

cout<

水魚五筆編碼練習系統

水魚五筆編碼練習系統是我大三時的乙個課程設計作品,因我小時候就學會了五筆,再之身邊會五筆的人沒幾個,想學五筆的人又沒有簡單 有效的五筆練習軟體可以拿來用,這讓我萌生了寫一款五筆練習軟體的想法。個人覺得金山打字通 明天打字員等五筆練習軟體,很不適合五筆初學者,這更加強了我寫 這款軟體的決心。所以我將這...

騰訊筆試題 五筆編碼

l abcdefghijklmnopqrstuvwxy l list l 第一位之前的個數函式 deffirst l,char k l.index char return k 26 25 1 25 1 第一位確定好後,第二位之前的個數函式 defsecond l,char k l.index cha...

五筆的編碼和解碼

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...