题目描述:在微软产品Excel中,用A表示第1列,B表示第2列……Z表示第26列,AA表示第27列,AB表示第28列……以此类推。请写一个函数,输入用字母表示的列号编号,输入它是第几列。
例如:输入:HAT——输出:5454、输入:AA——输出:27、
题目分析:从题目要求可知,我们需要实现一个将输入字符串转换成整型的函数,而这个要求实际上是需要我们将输入的表示二十六进制(用A~Z表示的二十六进制)的字符串转换成十进制。
思路分析:比如说我们要将ABC这个二十六进制转换成十进制,我们是这样做的:A * 26^2 + B * 26^1 + C * 26^0,那么我们可以根据这个普通式推出它的一般表达式:weight(A) * 26^n,weight(A)表示在二十六进制里面所表示的值,n表示A在字符串中所处的位置,n = length - i - 1, i 表示字符ch的在字符串中的位置。
代码实现:
package IQ15;//Interview questions /** * * @author 康茜 * 题目:在Excel中, 用A表示第1列, B表示第2列......, Z表示第26列,AA表示第27列,AB表示第28列..., 以此类推。请写出一个函数, * 输入用字母表示的列号编码,输出他是第几列。 * */ public class Test { /** * 将十进制转换成二十六进制(用A~Z表示的二十六进制) * 这里使用反向取余的方式将十进制转换成二十六进制 * @param n * @return */ private static StringBuffer DecimalToTwentysix(int n) { StringBuffer result = new StringBuffer(); while(n > 0) { int remainder = n % 26; result.append((char)(remainder + 64));//大写A的ASCII码值为65 n = n/26; } return result.reverse();//字符串反转 } /** * 将二十六进制转换成十进制 * @param str * @return */ private static int TwentysixToDecimal(String str) { String strWeight = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int result = 0; for(int i = 0; i < str.length(); i++) { char ch = str.charAt(i); int weight = weight(strWeight, ch); result += Math.pow(26, str.length()-i-1) * weight; } return result; } //返回字符ch在str中所代表的权值 private static int weight(String str, char ch) { int weight = 0; for(int i = 0; i < str.length(); i++) { if(str.charAt(i) == ch) { weight = i+1; } } return weight; } public static void main(String[] args) { System.out.println(TwentysixToDecimal("HAT")); System.out.println(DecimalToTwentysix(5454)); } }