一、 形如Microsoft excel中的列标为A、B、C……Z、AA、AB……ZZ,并假设A列标对应的为excel的第0列;请用最简单快捷的方式实现以下功能:
1、 任意输入1个或2个字母的组合,查找出该单个字母或组合对应的为哪列(例如输入AA,则打印出为第26列)
2、 任意输入1个列数字,查找出该列对应的字母或字母组合,如果越界则打印出“输入列越界,请重新输入”;(例如输入26,则打印出AA)
注意:不可采用定义大数组的方式,即定义所有字母及组合的一个大数组
写了下,代码不好看,但是可以用。
public class test{
public static void main(String[] args){
if(args.length<1){
System.out.println("没有输入");
return;
}
transform(args[0]);
}
public static void transform(String str){
try{
int num = Integer.parseInt(str);
if(num > 26*26*25){
System.out.println("输入列越界,请重新输入");
return;
}
String text = "";
int tmp = num / 26;
if(tmp>0) text += (char)('A'+tmp-1);
tmp = num % 26;
text += (char)('A'+tmp);
System.out.println(text);
}catch(Exception e){
String text = str.toUpperCase();
if(text.length()>2 || text.length()<1){
System.out.println("输入字符串不正确,请重新输入");
return;
}
char[] chars = text.toCharArray();
int num = 0;
if(chars.length==1){
num += chars[0]-'A';
}else{
num += chars[1]-'A';
num += (chars[0]-'A'+1)*26;
}
System.out.println(num);
}
}
}
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String val = scan.nextLine();
new Test().test(val);
}
public void test(String val) {
String result = "";
if(val == null || val.length() == 0) {
//非法参数
System.out.println("非法参数");
return;
}
if(Pattern.matches("^[0-9]+$", val)) {//数字
int iVal = Integer.parseInt(val);
final int maxIndex = 26 * 27 - 1;
if(iVal > maxIndex) {
//下标越界
System.out.println("下标越界");
return;
} else {
char high = (char) ((iVal / 26 - 1) + 'A');
char low = (char) (iVal % 26 + 'A');
result += high + "" + low;
}
} else if(Pattern.matches("^[a-zA-Z]{1,2}$", val)) {//字母A-Z,最多两位
val = val.toUpperCase();
char[] arr = val.toCharArray();
int len = val.length();
if(1 == len) {
result += arr[0] - 'A';
} else {
int high = ((arr[0] - 'A') + 1) * 26;
int low = arr[1] - 'A';
result += high + low;
}
} else {
//格式有误
System.out.println("格式有误");
return;
}
System.out.println("输入:" + val + ",结果:" + result);
}
}