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();
}
}
百度2016实习-编号转换
最新推荐文章于 2022-09-20 16:28:56 发布