[算法]华为笔试题——字母和十进制数映射

题目描述:

使用字母来表示一个正整数,用小写字母表示。映射规则很简单,如下所示:

a 1

b 2

...

z 26

aa 27

ab 28

...

huawei 104680767

...

输入描述:

输入字母最少1位,最多6位,且字母只能是小写字母。输入的十进制数不超过32位整数最大值。

判断输入字符串的有效性,若无效输出ERROR。

输出描述:

输入十进制数,返回字母表示的数。输入字母表示的数,返回十进制数。

示例:

输入:

ab

输出:

28

思路:

主要是一个26进制和10进制的转换,26转10很容易,10转26涉及到余数那里需要考虑一下特殊情况(26 % 26 == 0这里)。

代码:

package com;

public class Test2 {
    public static String convertTo26(String input) {
        String ret = "";
        if (input.matches("[1-9]{1}[0-9]{0,}")) {
            int inputInt = Integer.parseInt(input);
            StringBuilder sb = new StringBuilder();
            do{
                int temp = inputInt % 26;
                if(temp == 0){
                    //这里需要特殊处理,否则如果是26不会生成z,会生成a`
                    sb.insert(0, convertChar(26));
                    inputInt = inputInt / 26 - 1;
                }else{
                    sb.insert(0, convertChar(temp));
                    inputInt = inputInt / 26;
                }
            }while(inputInt != 0);
            ret = sb.toString();
        } else if (input.matches("[a-z]{1,6}")) {
            int sum = 0;
            for (int i = input.length() - 1; i >= 0; i--) {
                sum += convertInt(input.charAt(i)) * Math.pow(26, input.length() - 1 - i);
            }
            ret = sum + "";
        } else {
            ret = "ERROR";
        }
        return ret;
    }

    /**
     * 字符转数字a-1
     * @param charactor
     * @return
     */
    public static int convertInt(char charactor) {
        return ((int) (charactor - 'a') + 1);
    }
    
    /**
     * 数字转字符1-a
     * @param num
     * @return
     */
    public static char convertChar(int num){
        return ((char)(num + 'a' - 1));
    }

    public static void main(String[] args) {
        System.out.println(convertTo26("zzz"));
        System.out.println(convertTo26("321272407"));
    }
}
原文地址:https://www.cnblogs.com/DarrenChan/p/7458597.html