剑指offer——二十六进制和十进制的相互转换

题目描述:在微软产品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));
	}
}

猜你喜欢

转载自blog.csdn.net/kangxidagege/article/details/80015944