百度2016实习-编号转换

package 百度;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 题目描述:
 * 小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,
 * 她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,
 * 第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。
 * 
 * 表格单元所在的行则是按数值从1开始编号的,表格单元名称则是其列编号和行编号的组合,
 * 如单元格BB22代表的单元格为54列中第22行的单元格。
 * 
 * 小B感兴趣的是,编号系统有时也可以采用RxCy的规则,其中x和y为数值,表示单元格位于第x行的有第y列。
 * 上述例子中的单元格采用这种编码体系时的名称为R22C54。
 * 
 * 小B希望快速实现两种表示之间的转换,请你帮忙设计程序将一种方式表示的坐标转换为另一种方式。
 * 
 * 输入
 * 输入的第一行为一个正整数T,表示有T组测试数据(1<=T<=10^5)。随后的T行中,每行为一组测试数据,
 * 为一种形式表示的单元格坐标。保证所有的坐标都是正确的,且所有行列坐标值均不超过10^6。
 * 样例输入 2 R23C55 BC23
 * 
 * 输出 对每组测试数据,单独输出一行,为单元格坐标的另一种表示形式。 样例输出 BC23 R23C55
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年5月15日 下午4:38:31
 * 解题思路:题目的本质就是对数据表格的位置进行坐标的转换,转换形式R23C55<--->BC23
 * 我的理解是将其看作是26进制的数字和字母的转换。
 */
public class Q2016实习_编号转换2 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			int n = scanner.nextInt();
			//添加一行回车
			scanner.nextLine();
			Pattern p = Pattern.compile("R\\d+C\\d+");//模式串的匹配样式
			for(int i=0; i<n; i++){
				String string = scanner.nextLine();
				Matcher matcher = p.matcher(string);
				if(matcher.matches()){//如果匹配,则表达形式为R23C55
					String[] parts = string.split("[RC]");
					//上句代码分割的形式为:parts[0]为“”,parts[1]为23,parts[2]为55
					//要输出的形式为BC23
					//将parts[2]55转换为大写字母BC
					int clos = Integer.parseInt(parts[2]);
					while(clos!=0){
						if(clos%26==0){
							parts[1] = "Z" + parts[1];//Z23形式
							clos = clos/26 -1;
						}else{
							parts[1] = (char)(clos%26 + 'A' - 1) +parts[1];//C23形式
							clos = clos/26;
						}
					}
					System.out.println(parts[1]);
					
				}else{//匹配返回值为false,则表示形式为BC23,将其转换为R23C55 的形式,本质将BC->55
					//现将BC23分成字母和数字两部分
					int clos = 0;
					String string2 = "";
					for(int j=0 ;; j++){
						if(string.charAt(j) < 'A'){
							string2 = string.substring(j);
							break;
						}
						clos = clos * 26;//可以看作是26进制的数字转换
						clos = clos + (int)(string.charAt(j)-'A'+1);//相当于加上余数的操作
					}
					System.out.println("R" + string2 + "C" + clos);
				}
			}//for
		}//while
		scanner.close();
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值