剑指offer——二十六进制和十进制的相互转换
程序员文章站
2022-03-13 17:45:00
...
题目描述:在微软产品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));
}
}