一、问题
给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
示例1:
输入:columnNumber = 1
输出:"A"
示例2:
输入:columnNumber = 28
输出:"AB"
示例3:
输入:columnNumber = 701
输出:"ZY"
示例4:
输入:columnNumber = 2147483647
输出:"FXSHRXW"
提示:
· 1 <= columnNumber <= 231 - 1
二、思路和方法
根据题目:A表示1,B表示2...Z表示26,可以看出表中对应的列名称的规律是:26进1。我们可以根据此规律来解决问题。但是这条规律又与进制的表示方法有所不同,进制的每一位的数字最小可以表示为0,但是列名称的最小值为 ’A‘(1)。我们需要根据情况解决问题。
首先,我们使用 除26取余法将给定数字 columnNumber 的26进制获取,然后根据每一位上是为0来向跟高位进行借位,然后转换为字符串就可以得到Excel 表的列名称。
上面这个方法需要使用三步才能得到我们想要的数据,我们可以将其优化:
使用一个StringBulider来存储列名称,每次循环都将最后一位列名称加入集合。在进制转换之前,我们需要对 columnNumber 进行 -1 操作,以达到 整体偏移
举个例子:
columnNumber :52 -> AZ
我们正常计算得到的26进制数:2 0 ,得到的结果显然不符合期望值;我们对其 -1 操作
得到:1 25 -> AY,这也不符合期望的数据,但是我们在进行存储的时候采取的是 'A' + index 的方式来存储数据,'A'本身代表1,所以这样的方式可以得到我们期望的结果。
三、代码
/* 1 */
List<Integer> list = new ArrayList<>();
StringBuilder builder = new StringBuilder();
int x = 1;
int y;
while (x != 0) {
x = columnNumber / 26;
y = columnNumber % 26;
columnNumber = x;
list.add(y);
}
int len = list.size();
for (int i = 0;i < len - 1; i++) {
if (list.get(i) == 0) {
list.set(i, 26);
list.set(i + 1, list.get(i + 1) - 1);
}
}
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i) != 0) {
char a = (char) ('A' + list.get(i) - 1);
builder.append(a);
}
}
return builder.toString();
/* 2 */
public String convertToTitle(int columnNumber) {
StringBuilder builder = new StringBuilder();
while (columnNumber > 0) {
columnNumber--;
builder.append((char) ('A' + columnNumber % 26));
columnNumber /= 26;
}
return builder.reverse().toString();
}
四、执行结果
info1
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:35.6 MB,击败了39.21% 的Java用户
info2
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:35.5 MB,击败了62.64% 的Java用户