当前位置: 首页 > news >正文

(牛客腾讯思维编程题)编码编码分组打印下标题目分析

本题答案在这点击进入

假定一种编码的编码范围是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,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index.

输入描述:
输入一个待编码的字符串,字符串长度小于等于100.

输出描述:
输出这个编码的index
示例1

输入

baca

输出

16331

题目分析

如果你之前做过另一个题目,“求字符的所有组合,当输入的字符串中含有相同的字符串时,相同的字符交换位置是不同的排列,但是同一个组合。举个例子,如果输入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' 是指向字符串 a aaa的第3位a的指针,p是指向字符串 b aaa的指针,那么按排列规则,aaaa与baaa之间应该有字符串aaab,aaac,...aaay, aab,aaba...aaby...ab,aba,abaa,...abyy, ay,aya,ayaa...ayyy,b,ba,baa,再加上aaaa自身,这一系列字符串正好是一个完整的 + +


综上,mnoq相对于字符串a的index应该是


分析完毕。输入index反向查找字符串正好是将上面的分析过程反过来,这里不详细记述。代码如下

相关文章:

  • 腾讯2017秋招笔试编程题--游戏任务标记 java 实现+ c 实现
  • 腾讯面试编程给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。
  • Docker的C/S模式
  • Docker与自动化部署
  • docker守护进程和配置操作
  • docker远程访问
  • 大数据的后台分析模式
  • CentOS 7.0关闭默认防火墙启用iptables防火墙
  • URI统一资源定位服务
  • linux免密登陆
  • linux netstat命令
  • 常用linux操作指令
  • hadoop搭建和指令
  • linux WC命令解析
  • linux shell脚本指令
  • 2017 年终总结 —— 在路上
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • IDEA常用插件整理
  • JavaScript 一些 DOM 的知识点
  • js中的正则表达式入门
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • magento2项目上线注意事项
  • Vue 重置组件到初始状态
  • 第十八天-企业应用架构模式-基本模式
  • 基于axios的vue插件,让http请求更简单
  • 解析 Webpack中import、require、按需加载的执行过程
  • 判断客户端类型,Android,iOS,PC
  • 如何用vue打造一个移动端音乐播放器
  • 算法系列——算法入门之递归分而治之思想的实现
  • 【云吞铺子】性能抖动剖析(二)
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • raise 与 raise ... from 的区别
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (¥1011)-(一千零一拾一元整)输出
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)Linux Shell编程——输入输出重定向
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net MySql
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET下ASPX编程的几个小问题
  • .NET序列化 serializable,反序列化
  • .Net语言中的StringBuilder:入门到精通
  • /etc/fstab和/etc/mtab的区别