Java 实现 输入 AA 输出 AB ..输入 AZ 输出 BA 一直到输出 ZZ

2019-06-05 14:30:04 +08:00
 h8743

:)

4706 次点击
所在节点    Java
41 条回复
passerbytiny
2019-06-05 16:22:46 +08:00
@AntiGameZ #20 这个不是严格的 26 进制,我暂时还不知道怎么搞。
brust
2019-06-05 16:25:21 +08:00
字母版的 26 进制吗
passerbytiny
2019-06-05 16:54:26 +08:00
@AntiGameZ #20 这东西要用矩阵去求取,不能用 26 进制。

public class ExcelSheetColumnTitle {
static Map<Integer, Character> index2titleMap = new HashMap<>();
static {
index2titleMap.put(1, 'A');
index2titleMap.put(2, 'B');
index2titleMap.put(3, 'C');
index2titleMap.put(4, 'D');
index2titleMap.put(5, 'E');
index2titleMap.put(6, 'F');
index2titleMap.put(7, 'G');
index2titleMap.put(8, 'H');
index2titleMap.put(9, 'I');
index2titleMap.put(10, 'J');
index2titleMap.put(11, 'K');
index2titleMap.put(12, 'L');
index2titleMap.put(13, 'M');
index2titleMap.put(14, 'N');
index2titleMap.put(15, 'O');
index2titleMap.put(16, 'P');
index2titleMap.put(17, 'Q');
index2titleMap.put(18, 'R');
index2titleMap.put(19, 'S');
index2titleMap.put(20, 'T');
index2titleMap.put(21, 'U');
index2titleMap.put(22, 'V');
index2titleMap.put(23, 'W');
index2titleMap.put(24, 'X');
index2titleMap.put(25, 'Y');
index2titleMap.put(26, 'Z');
}

public String valueToTitle(int n) {
int row = n / 26;
int column = n % 26;
if (column == 0) {
row -= 1;
column = 26;
}

if (row == 0) {
return String.valueOf(index2titleMap.get(column));
} else if (row >= 1 && row <= 26) {
return new StringBuilder().append(index2titleMap.get(row)).append(index2titleMap.get(column)).toString();
} else {
return null;
}
}
}
ipwx
2019-06-05 16:55:52 +08:00
msaionyc
2019-06-05 17:03:04 +08:00
@passerbytiny 老哥你这 26 行 put 方法写的不累吗?万一哪行写错了怎么办
jason19659
2019-06-05 17:10:38 +08:00
@firefffffffffly
得用 equals
if( "AA".equals(input)) {
System.out.println("AB");
} else if("AZ".equals(input)) {
System.out.println("BA 一到输出 ZZ");
}
NoKey
2019-06-05 17:12:24 +08:00
一楼最优秀。。。
26 楼最认真。。。
over
woscaizi
2019-06-05 17:20:19 +08:00
转为 char 数组,直接 char +1,逢 27 进 1
yoke123
2019-06-05 17:21:31 +08:00
秀的头皮发麻 老铁 没毛病
vulgur
2019-06-05 17:39:57 +08:00
MineDog
2019-06-05 17:47:09 +08:00
应该是 2 位 27 进制自增返回才对
yumenawei
2019-06-05 18:08:08 +08:00
竟然真有老哥给答案。
MineDog
2019-06-05 18:17:24 +08:00
想错了,还是 26 进制

public String func (String str){
char[] cs = str.toCharArray();
if(cs.length!=2 || cs[0]< 'A' || cs[0] < 'Z' || cs[1]< 'A' || cs[1] > 'Z' ){
throw new IllegalArgumentException(String.format("参数错误:%s", str));
}
cs[1]++;
if(cs[1]>'Z'){
cs[0]++;
cs[1]='A';
}
if(cs[0]>'Z'){
throw new IllegalArgumentException(String.format("参数错误 : %s", str));
}
return String.valueOf(cs[0]) + String.valueOf(cs[1]);
}
zjp
2019-06-05 18:37:53 +08:00
通用说是字典序,不过这里不用这么麻烦
zsdroid
2019-06-05 19:15:21 +08:00
<?php
//php 是世界上最好的语言
$input = 'AA';
echo ++$input;//AB

$input = 'ZY';
echo ++$input;//ZZ
?>
oneisall8955
2019-06-05 19:59:57 +08:00
@firefffffffffly 除了不用 equals,input 输入变量不在在后面防止空指针外,没挑出毛病了!
fmumu
2019-06-05 20:54:20 +08:00
26 进制?
small2Sun
2019-06-05 21:13:03 +08:00
@firefffffffffly 它要输出 AB..
wenzhoou
2019-06-06 09:04:44 +08:00
public static int c2i(String s) {
return s.length() == 1 ? s.charAt(0)-'A' : c2i(s.substring(0, s.length()-1))*26 + (s.charAt(s.length()-1)-'A');
}
public static String i2c(int i) {
return i < 26 ? ("" + (char)('A' + i)) : i2c(i/26) + i2c(i%26);
}

public static String padTo2Digit(String s) {
return ("A" + s).substring(s.length()-1);
}

String input = "AA";
System.out.println(padTo2Digit(i2c(c2i(input)+1)));
passerbytiny
2019-06-06 14:51:43 +08:00
@AntiGameZ #20
@ipwx #24
LeetCode 不太会用😥,怎么用的,提交成功后貌似只能自己看,讨论区要另外创建内容。
矩阵方式的代码,提交的时候被拒了,其测试用例要求的是 AAA 甚至更多字母都要被解析,而我那个最多支持到两位字母。后来搞了个很难以理解的方式,能支持解析 int 的全部范围。
话说 LeetCode 貌似是为了防止 1 楼的方式,隐藏了实际的测试用例,然而用起来很不爽,要到提交的时候才知道自己跑题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/571126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX