码迷,mamicode.com
首页 > 其他好文 > 详细

2017腾讯秋招笔试题之编码

时间:2018-03-09 21:21:33      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:java 笔试题 ACM

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);    
    }

}
















2017腾讯秋招笔试题之编码

标签:java 笔试题 ACM

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!