题目描述
假定一种编码的编码范围是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

首先分析题目,发现编码其实是一个数组,数组大小为25的四次方。但是代码构建一个数组会有空间限制的问题,构建完成之后再遍历查询得到编码又会有时间复杂度的问题。所以这种方式不建议选取。

仔细观察这个数组,发现有一定的规律。a开头的所有编码占用了连续的一段数组空间(其他字母同理),所以联想到树。

然后先构建一个由25棵树组成的森林,根节点分别为a、b、c…y,每棵树都是高度为3的满25叉树,子节点分别为a、b、c…y。如下图所示(有些b与y之间忘了打省略号请忽略)。

从第一棵树的根节点开始至各个节点的路径便为编码顺序,以第一棵树为例为a、aa、aaa、aaaa、aaab…ayyy,紧接第二棵树为b、ba、baa、baaa……byyy,最终达到yyyy。

下面开始联系题目。以baca为例,编码即为根节点为b的树和其子节点a及下一层子节点c及再下一层子节点a所组成路径的左侧节点个数(包括b、a、c、a四个节点)减一(因为a的编码为0)。如下图所示。

这时候,问题就由求解编码,变为了计算这条线左端所有节点的个数和。

我们假设输入字符串为S0S1S2S3共计四个字符。

那么第一层的个数和便为:S0 - 'a' + 1

第二层个数和为:(S0 - 'a')* 25^1 + (S1 - 'a' + 1)

第三层个数和为:(S0 - 'a')* 25^2 + (S1 - 'a') * 25^1 + (S2 - 'a' + 1)

第四层个数和为:(S0 - 'a')* 25^3 + (S1 - 'a') * 25^2 + (S2 - 'a') * 25^1 + (S3 - 'a' +1)

计算过程中注意判断S1、S2、S3是否存在,不存在时将对应的小的计算块置为0。

废话少说,下面上代码(考虑到扩展性,增加了size变量,表示题目中规定的编码字符串最大长度)。

import java.util.*;
import java.math.*;public class Main{public static void main(String[] args){Main object = new Main();Scanner sc = new Scanner(System.in);while(sc.hasNext()){String s = sc.nextLine();int index = object.encode(s, 4);if(index < 0){System.out.println("输入数据格式有误");}else{System.out.println(index);}}sc.close();}public int encode(String s, int size){int index = -1;int length = s.length();if(length == 0 || length > size){return index;}for(int i = 0; i < length; i++){if(s.charAt(i) < 'a' || s.charAt(i) > 'y'){return index;}}index = 0;for(int i = 0; i < size; i++){for(int j = 0; j <= i; j++){if(j < length){if(i == j){index += s.charAt(j) - 'a' + 1;}else{index += (s.charAt(j) - 'a') * Math.round(Math.pow((double)25, (double)(i - j)));}}}}return index - 1;}
}

腾讯面试算法题——编码相关推荐

  1. 【笔试面试题】腾讯2013实习生面试算法题及参考答案

    总结了一下自己遇到的以及同学遇到的面试算法题,是技术二面. 有几道题给出了参考答案,还有几道没有好的思路.路过的大侠如果有好的思路请留个言交流下呗~ 1.八数码问题:3*3的格子,有1~8个数,空了一 ...

  2. 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)

    常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...

  3. 力扣高频算法php_互联网公司最常见的面试算法题有哪些?

    很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么?你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 你在面试的时候,卡壳了,一时间忘了怎么 ...

  4. 互联网公司最常见的面试算法题大集合!

      转载于 新智元   来源:Github 编辑:元子 [导读]LeetCode是一个美国的在线编程网站,收集了各个大厂的笔试面试题,对找工作的毕业生和开发者来说,非常有价值.很多求职者都会在Leet ...

  5. 常考面试算法题类型总结(来自知乎)

    作者:牛客网 链接:https://www.zhihu.com/question/24964987/answer/200681301 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  6. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

  7. 一道小面试算法题的思路

    一道小算法题的思路 有这么一道小面试算法题:给定一个长度为 n 的整数数组,下标为 i 的元素表示第 i 天某个股票的价格,每次最多持有一股,每次买卖最多一股,在最多只买卖一次的情况下(先买后卖,不考 ...

  8. C++经典面试算法题

    #include <assert.h> #include <string.h> #include <stack>// // C++ 经典面试算法题 [7/28/20 ...

  9. 保研面试 算法题_GitHub - 13538899384/AlgorithmTest: 春招秋招笔试题目汇集

    秋招总结(Android开发工程师) 前言 从春招过渡秋招,连续半年时间都是努力奔波在求职路上,找工作确实非常累,无论是生理上还是心理上,记得我有次从广州跑过去深圳面完百度,接着面蘑菇街,再接着参加深 ...

  10. 字节跳动2021年4月面试算法题库

    本文汇总了牛客2021.4.1~2021.4.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...

最新文章

  1. MVVM设计模式之精髓简化
  2. the mysql is running_Mysql报错:TheMySQLserverisrunningwiththe--skip-grant-
  3. 如何运用UIControl自定义iOS中的控件
  4. 基于SRS的RTMP分发技术方案
  5. class AbstractAPI(metaclass=AbstractAPIMeta):SyntaxError: invalid syntax
  6. latex multicolumn_LaTeX入门(3)
  7. session 学习
  8. Nodejs 离线文档下载
  9. ev3无需使用计算机编程,Legoev3机器人怎么编程.docx
  10. 智能合约漏洞,公链的阿喀琉斯之踵
  11. 紫书刷题记录 UVa1593 代码对齐
  12. Android 圆角布局 shape.xml的使用
  13. FFmpeg学习(三)-- libavutil 代码组成
  14. Kubernetes学习笔记(一):Pod详解:Pod配置、Pod生命周期、Pod调度、容器设计模式
  15. Flurry analytics SDK集成步骤及功能简介
  16. linux桌面lxde 安装_Ubuntu怎么安装轻量级的LXDE桌面?
  17. 生鲜配送系统有哪些功能?搭建生鲜配送系统有哪些好处?
  18. 使用Flutter实现仿微信录音的插件
  19. 设置在桌面上显示计算机 回收站图标,我电脑属性自定义桌面,没有显示回收站的图标 怎么处理啊...
  20. 内连接(join、inner join )、左连接(left join) 、全连接(full join)

热门文章

  1. 怎么把mp4转换成html,html5-video – VLC:如何从mp4转换为webm
  2. 神经网络与误差反向传播算法
  3. 数据结构——克鲁斯卡尔(Kruskal)算法
  4. Android GIF图片显示
  5. 一个80年代大学生的悲壮职业人生
  6. flask 应用程序的工厂函数
  7. Android蓝牙通讯
  8. dbm数据库详解【flask】【dbm.gun解决】
  9. oracle12突然出现ora12514,【ORACLE】提示ORA-12514错误处理
  10. msl3等级烘烤时间_MSL等级说明