题目描述

五笔的编码范围是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位结合起来看,从第1位到第4位,其可能的排列组合分别是。对于每个字符串的index需要拆分开一位一位看。


先来看最末位,即字符串有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’)*( + 1)。举个例子

p' 是指向字符串aaaa的第3位a的指针,p是指向字符串aaba的指针,那么按排列规则,aaaa与aaba之间应该有字符串aaab,aaac,aaad...aaay, aab,再加上aaaa自身,这一系列字符串正好是一个完整的。再来看一个例子,aaaa与aaca,它们之间应该有字符串aaab,aaac,aaad...aaay,aab, aaba,aabb,aabc...aaby, aac,正好是2倍的 + 1。因此我们可以很容易得出结论,ndex = index' +(*p-*p’)* ( + 1)

再看第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)
{const int NUM = 25;const char* p = input.c_str();int index = 0;int N = 3;int SUM[4] = {1};for(int i = 1; i < 4; ++i)SUM[i] = NUM * (SUM[i-1]) + 1;while(*p){int temp = 0;index += (*p -'a')*SUM[N--];++p;}cout<<"index is "<<index<<endl;
}void WubiCoding(int index)
{const int NUM = 25;int SUM[4] = {1};for(int i = 1; i < 4; ++i)SUM[i] = NUM * (SUM[i-1]) + 1;char ch[5] = {'\0'};int N = 3;int M = 0;while(index > 0){ch[M++] = 'a' + (index - 1)/SUM[N];index = (index - 1)%SUM[N--];}    cout<<"string is "<<ch<<endl;
}

算法练习 - 五笔编码相关推荐

  1. 算法:五笔编码,如何根据输入的词条自动生成输入编码

    算法:五笔编码,如何根据输入的词条自动生成输入编码 一.想要实现的 最近做的一个五笔码表工具,想要实现根据用户输入的词条自动生成输入编码. 比如: 输入 我们 生成 trwu 输入 五笔基础知识 生成 ...

  2. 水鱼五笔编码练习系统

    水鱼五笔编码练习系统是我大三时的一个课程设计作品,因我小时候就学会了五笔, 再之身边会五笔的人没几个,想学五笔的人又没有简单.有效的五笔练习软件可以拿来用, 这让我萌生了写一款五笔练习软件的想法.个人 ...

  3. 【原创】生成五笔编码

    生成五笔编码 最近在修改项目中汉字生成五笔编码的问题.很多的生僻字无法生成对应的五笔编码.查找了很多资料,终于找到这个非常齐全的编码表.总共20902个汉字,包括汉字与对应的全拼.五笔.郑码.UNIC ...

  4. 五笔编码查询工具(念青字库) 新增快捷键 | #hta #五笔 #javascript

    前段时间写的五笔编码查询,最近又增加了快捷键: [list] [*]'/'键定位到输入框 [*]'Esc'键定离开推入框 [/list] 看图说话: [img]http://dl.iteye.com/ ...

  5. “乙”的五笔编码为什么是nnl

    N是乙的字根,再N是折的识别码.最后其实有两个L,它是单笔字的识别码. 又如:"一"字的全码是GGLL 补充: 五笔中,有五个笔划是特殊的.那就是代表五笔的横.竖.撇.捺.折.这五 ...

  6. 计算机五笔字型编码方法,无字型五笔编码计算机中文输入法

    主权项: 1.一种计算机中文键盘输入形码编码输入法,使用计算机通用西文键盘,选取汉字\r\r\r\r\n字根,对字根分组,将字根分组定义在西文键盘的不同键位上,构成中文键盘:其字编\r\r\r\r\n ...

  7. 五笔编码:“乙”为nnll解析

    作为成字根编码的一个特例,有必要把单笔画设计为打原码之后再打两个L键.这里之所以要加L,是因为L键除便于操作外,作为竖结尾的单体字的识别键码是极不常用的.这样,就足以保证这种定义外码的唯一性. 五种单 ...

  8. JS实现五笔编码查找对应index(nodejs实现)

    题目: 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, b, ...

  9. windows xp下反查五笔编码问题

    从98系统c:/windows/system目录下把winpy.ime和winpy.mb拷出来,进入dos,覆盖到xp系统c:/windows/system32目录下,重起,ok! 过程倒不复杂,不过 ...

  10. 五笔字根表识别码图_精选五笔输入法拆字原则,值得收藏

    随着网络的发展,电脑打字已经慢慢代替了笔墨纸砚,输入法也有很大的改善.随着搜狗输入法的崛起,人们已经淡忘了最传统的五笔打字.但五笔打字还是挺快挺实用的.下面就来总结一下五笔的拆字原则. 五笔输入法 拆 ...

最新文章

  1. Redis中的Cluster高可用和主从切换原理
  2. POJ - 2516 Minimum Cost(最小费用最大流)
  3. 算法基础:递归算法知识笔记
  4. Nova for mac(强大的代码编辑工具)
  5. 读写卡测试程序VFP源代码
  6. 超详细的python搭建区块链(下)
  7. Flutter 竖线 垂直分割线
  8. 站在知乎肩上-做更强的自己(4)
  9. Hadoop资源管理
  10. 惠新宸php教程_【转载】惠新宸:PHP在百度的应用现状及展望
  11. 【HP-MC/SG】HP-MC/SG添加LV测试
  12. Hive beeline常用操作
  13. 超级计算机在天文学的应用,破世界记录:交大π2.0超算系统实现天文学N体模拟粒子数新突破...
  14. 星起航:你抖音小店的产品入池了吗
  15. 报表数据动态生成页面
  16. 双重差分模型了解一下?
  17. 计算机飞行计划限制高度,关于计算机飞行计划格式调整的说明.PDF
  18. JS识别二维码,JS解二维码,前端识别二维码
  19. c++处处有杀机,不小心就要掉坑里
  20. 如何将以前wm手机所备份的bkg文件导入android手机,【极光ROM】-【三星S20(国行/港版/台版/韩版/美版) G981X-高通865】-【V5.0 Android-Q-TI8】...

热门文章

  1. 《Dreamweaver CS6 完全自学教程》笔记 第四章:创建站点
  2. dw cs5 html,Dreamweaver CS5-HTML简介
  3. 【学习笔记】山东大学生物信息学-08 编程基础与网页制作
  4. 数据分析师工作的一点点感悟
  5. ElementUI 日期组件在IE下数据无法正常显示
  6. 生活是苦难的,我又划着我的断桨出发了
  7. 威联通qnap SMB速度慢 只有30M、50M的解决方法
  8. Toast基本使用方法
  9. 几款任意波形发生卡推荐
  10. git cherry-pick的使用教程