2017腾讯秋招笔试题之编码

Description:

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

Input:

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

Output:

输出这个编码的index

Example:

Input: bcac     Output: 16331

看到题目第一时间其实是没有看懂的,没看出来题目中提到的编码有什么规律。仔细分析一下,按照题目要求:

Index(a) = 0; Index(aa) = 1; Index(aaa) = 2; Index(aaaa) = 3; Index(aaab) = 4 ...

既然已经知道初始值,那我们可以利用这些已有的Index去推算相邻的字符编码,从低位到高位:

Index(aaaa)到 Index(aaab) :base4 = 1;

Index(aaa) 到 Index(aab)  :base3 = 25*base4 + 1;

Index(aa)  到 Index(ab)   : base2 = 25*base3 + 1;

Index(a)   到 Index(b)    :base1 = 25*base2 + 1;

知道a到b之间的推算,就很容易计算a到c,d...只需要乘以间隔就行。然后只需要按位计算每个位上的编码,最后将整个字符串的编码相加就可以了。

例如输入: bcac

第一位b: coding1 = ('b'- 'a')*base1 + 1;

第二位c: coding2 = ('c'- 'a')*base2 + 1;

第三位a: coding3 = ('a'- 'a')*base3 + 1;

第四位c: coding4 = ('c'- 'a')*base4 + 1;

最终的编码为 coding = coding1+coding2+conding3+conding4-1;(减1是因为编码是从0开始的)

源代码(不是最优化的,只是个思路)

public class code {
    public static void main(String args[]){
        int base4 = 1;
        int base3 = 25*base4 + 1;
        int base2 = 25*base3 + 1;
        int base1 = 25*base2 + 1;
        int[] indexbox = new int[]{base1,base2,base3,base4};
        String inpt ; //input
        int oupt = 0; //output
        Scanner sc = new Scanner(System.in);
        inpt = sc.next();
        sc.close();
        char[] inpt_character = inpt.toCharArray(); //将输入的字符串转化成数组
        for(int i=0;i < inpt_character.length;i++){
            oupt += (int)(inpt_character[i] - 'a')*indexbox[i%4] + 1;
        
        }
        System.out.println(oupt-1);    
    }

}

原文地址:http://blog.51cto.com/acevi/2084687

时间: 2024-10-27 00:46:16

2017腾讯秋招笔试题之编码的相关文章

TX2017秋招笔试题之编码

问题描述: 假定一种编码的编码范围是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. 输入描述: 输入一个待编码的字符串,字符串长度小于

网易2017秋招笔试题3:最长公共子括号序列长度

[问题来源]网传的2017网易秋招笔试题 [问题描述] [算法思路] 下面的解题思路摘自  http://www.cnblogs.com/Atanisi/p/7500186.html 刚看到题我就想到暴力解,深搜出所有合法的括号序列,再依次比较公共子序列的长度,返回最长的.但是深搜一般和路径有关,这道题仅仅需要最大公共子序列的长度.而我们发现最大公共子序列的长度就是 s.size() - 1(当且仅当修改距离为 1 时 LCS 最大), 那么我们就想到,可以变换 s 中一个括号的位置,枚举所有的

美团2017秋招笔试题 拼凑钱币

给你六种面额 1.5.10.20.50.100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数. 输入描述: 输入包括一个整数n(1 ≤ n ≤ 10000) 输出描述: 输出一个整数,表示不同的组合方案数 设f[i][j]为使用a[0]-a[i]的面额凑到j元的不同组合个数 #include <iostream> #include <cstring> using namespace std; int a[6] = {1,5

TX2017秋招笔试题之geohash编码

问题描述:geohash编码:geohash常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二步是base32转码. 此题考察纬度的二进制编码:算法对纬度[-90, 90]通过二分法进行无限逼近(取决于所需精度,本题精度为6). 注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间.算法举例如下: 针对纬度为80进行二进制编码过程: 1) 区间[-90, 90]进行二分为[-90, 0),[0, 90],成为左右区间,可以确定80为右区间,标

TX2017秋招笔试题之素数对

问题描述: 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果.输入值小于1000. 如,输入为10, 程序应该输出结果为2.(共有两对质数的和为10,分别为(5,5),(3,7)) 输入描述: 输入包括一个整数n,(3 ≤ n < 1000) 输出描述: 输出对数 示例1 输入 10 输出 2 ------------------------------------------------ 解决思路; 首先判断素数(在大于1的自然数中,除了1和它本身以外不再有其他因数

滴滴秋招笔试题(2016-09-18)

1.地下迷宫 这道题是网上找到别人的答案,拿过来学习学习,望勿怪. import java.io.BufferedInputStream; import java.util.Scanner; public class 地下迷宫 { public static int[][] dir = { { 1, 0, 0 }, { 0, 1, 1 }, { -1, 0, 3 }, { 0, -1, 1 } }; public static int n = 0; public static int m = 0

序列和-------一道大厂秋招笔试题

题目: 给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N.答案可能有多个,我我们需要找出长度最小的那个. 例如 N = 18 L = 2: 5 + 6 + 7 = 18 3 + 4 + 5 + 6 = 18 都是满足要求的,但是我们输出更短的 5 6 7 综合网上给出的参考答案,有两种相对简单,用python语言重写一下. 方法一:从数列的角度出发 解题思路:等差数列求和. 该题可理解为“一段长度大于等于L的等差数列之和等于N”的过程. S =L(a1+an) /

2017年腾讯 秋招软件开发笔试编程题回忆版

2017年腾讯秋招软件开发笔试编程题回忆版 (所有题目大致描述如下,并非完整的题目回忆,但意思大致一样) 1.又一个魔法城市,城市里面有n个魔法城堡,序号为0,1,2...n-1:魔法城堡之间都有路径相连:魔法城堡两两之间的到达的距离不同,因此所需时间也可能不会相同.如魔法城堡0到魔法城堡2需要耗时4小时:现,小明想从魔法城堡0到魔法城堡1,他想知道需要花费多少时间:为了快速到达,有一魔法扫把,魔法扫把使用次数有限,使用一次,可以将某一段间的时间减半:求小明从魔法城堡0到魔法城堡1花费的最小时间

腾讯暑期实习笔试题 有趣的梅式砝码问题

无意间看到这样的一个题目,题目内容是: 用4个砝码称出1到40的重量的物体,这四个砝码的重量分别是多少?? 此处有一点必须注意,很多人一拿到题目(包括我自己),一下子就想到了二进制的解法,可是立刻就发现,二进制的40需要的位数大于4位,也就是说不靠谱. 更加值得注意的是,二进制的方法用在此处,相当于只是将砝码做加法,并未考虑减法,见过天平的同学都知道,砝码是可以和物体放在一边的.因此是可以做减法的. 看了大多数人的题解,提到了,这是一个"梅式砝码"的问题,首先:作出如下假设:(有点类似