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

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