欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面试-阿里社招笔试题两则(一)----Excel列号转数字

程序员文章站 2022-06-04 16:56:52
...

Excel列号转数字

根据excel列号计算列数以及根据列号计算列数,excel中的列数是使用字母表示的,即A,B,C…Z,AA…,ZZ…这种情况,假设我们输入A,那么输出结果为1,输入27,输出结果为AA,以此类推。

解答:考虑和十进制转二十六进制联系起来,本质上是一样的问题。

package com.lhc.translate;

import org.junit.Test;

/**
 * @description:
 * @author: hjt
 * @create: 2020-07-19 15:55
 */
public class ExcelNumber {

    /**
     * 根据excel列号计算列数以及根据列号计算列数,excel中的列数是使用字母表示的,即		A,B,C...Z,AA...,ZZ....这种情况,
     * 假设我们输入1,那么输出结果为1,输入27,输出结果为AA,以此类推。
     *
     * @param num
     * @return
     */
    public static String numCovertLetter(int num) {
        String str = "";
        while (num > 0) {
            int res = num % 26;
            if (res == 0) {
                res = 26;
            }
            str = (char) (res + 64) + str;
            num = (num - res) / 26;
        }
        return str;
    }

    @Test
    public void testNumCovertLetter() {
        int num = 703;
        System.out.println(numCovertLetter(num));
    }


  • 补充-1 : 由列号来转换数字(把上面的思路反过来)
    /**
     * 反过来根据列号来计算数字
     *
     * @param str
     * @return
     */
    public static int letterCovertNum(String str) {
        int sum = 0;
        char[] arr = str.toCharArray();
        int n = str.length();
        for (int i = 0; i < n; i++) {
            /**
             * arr[i] - 64:A=65-64=1、B=66-64=2
             * n位数=n位数字*26的n-1次方
             */
            sum += (arr[i] - 64) * Math.pow(26, n - (i + 1));
        }
        return sum;
    }

    @Test
    public void testLetterCovertNum() {
        String str = "AAA";
        System.out.println(letterCovertNum(str));
    }

补充-2 : 10进制转换n进制

这个代码和原来代码稍微有点区别

	/**
     * 10进制 转换 n 进制
     *
     * @param num
     * @param n
     * @return
     */
    public static String numCovertN(int num, int n) {
        if (num <= 0) {
            throw new RuntimeException("参数必须大于0");
        }
        String str = "";
        while (num > 0) {
            int res = num % n;
            /*if (res == 0) {
                res = pos;
            }*/
            str = res + str;
            num = (num - res) / n;
        }
        return str;
    }

    @Test
    public void testNumCovertN() {
        System.out.println(numCovertN(5, 3));
    }

补充-3:n进制转换10进制


    /**
     * n 进制转换 10进制
     *
     * @param str
     * @return
     */
    public static int NCovertNum(String str, int n) {
        int sum = 0;
        char[] arr = str.toCharArray();
        int length = str.length();
        for (int i = 0; i < length; i++) {
            sum += (arr[i] - 48) * Math.pow(n, length - (i + 1));
        }
        return sum;
    }

    @Test
    public void testNConvertNum(){
        System.out.println(NCovertNum("12", 3));
    }
}
相关标签: 面试 笔试题