Java “为什么?”;col";变量返回错误的值

Java “为什么?”;col";变量返回错误的值,java,Java,在最近的一次工作面试中,我不得不解决一个程序性问题。问题是将给定的excel字母表列名转换为列号。我的解决方案在很大程度上起了作用,直到他们(面试官)给我起了“AUHS”作为专栏名。解决方案失败了。预期答案是“31999”,但我得到了“18999”。我想了解我哪里出了问题,以及我可以做些什么来改进解决方案 附言:我是Java新手 我的解决方案 public class test { public static void main(String[] args) { Str

在最近的一次工作面试中,我不得不解决一个程序性问题。问题是将给定的excel字母表列名转换为列号。我的解决方案在很大程度上起了作用,直到他们(面试官)给我起了“AUHS”作为专栏名。解决方案失败了。预期答案是“31999”,但我得到了“18999”。我想了解我哪里出了问题,以及我可以做些什么来改进解决方案

附言:我是Java新手

我的解决方案

public class test {

    public static void main(String[] args) {
        String argChar = "AUHS";

        char a = 'A';
        int asciiA = (int) a;

        int col = 0;
        col += Math.pow(26, 0) + (int)argChar.charAt(argChar.length()-1) - asciiA;

        for(int i=1; i<argChar.length(); i++) {
            col += (int)(Math.pow(26, i) + ((int)argChar.charAt(argChar.length()-(i+1)) - asciiA) * 26);
        }

        System.out.println(col);

    }
}
公共类测试{
公共静态void main(字符串[]args){
字符串argChar=“AUHS”;
字符a='a';
int asciiA=(int)a;
int col=0;
col+=Math.pow(26,0)+(int)argChar.charAt(argChar.length()-1)-ascia;
对于(int i=1;电子表格字母列标签的公式
A-Z编码(base-26)列标签的顺序为:

A .. 1 (= 26^0*1)
B .. 2 (= 26^0*2)
H .. 2 (= 26^0*8)
S .. 2 (= 26^0*19)
U .. 2 (= 26^0*21)
Z .. 26 (= 26^0*26)

AA .. 27 (= 26^1*1 +1)
AZ .. 52 (= 26^1*1 +26)  
BA .. 53 (= 26^1*2 +1)
ZZ .. 702 (= 26^1*26 +26)

AAA .. 703 (= 26^2*1 + 26^1*1 + 26^0*1)
UHS .. 14423 (= 26^2*21 + 26^1*8 + 26^0*19)
AUHS .. 31999 (= 26^3*1 + 26^2*21 + 26^1*8 + 26^0*19)
因此,我们可以将公式(伪数学表示法)推导为:

另见

这个公式的Java部分 鉴于以下输入:

  • 列标签
    String列标签
  • 基数
    int基数=26
  • ASCII码偏移量
    int-asciiOffset=65-1
    A
    具有十进制ASCII码
    65
我们需要计算以下工作变量:

  • 向后索引
    int backwardsIndex
    ,最初为
    0
    ,在遍历每个字符时递增1;从列标签的末尾开始(因此:向后!)
  • 正在运行的列编号
    长列编号
    ,其中在每次迭代期间将添加列字母数字字符表示
Java中的公式
由于计数从1开始,列从
A
开始计数,因此需要更正
argChar.charAt(i)-“A”+1
,以正确地将字符转换为数字:

String argChar=“AUHS”;
int-pow=1;
int n=0;
对于(int i=argChar.length()-1;i>=0;i--){
n+=(argChar.charAt(i)-'A'+1)*功率;
功率*=26;
}
System.out.println(“n=”+n);
输出:

n = 31999

为什么预期答案是31999?请口头描述您的逻辑。将
excel字母表列名转换为列号是什么意思?
?它是否与excel中的电子表格列相关,这些列由两个字母组成,如excel电子表格上的“@khelwood”,如果向右滚动,则列号由“AUSH”表示列标题名称应为“31999”。类似的示例,27为列标题“AA”,28为列标题“AB”,等等。我希望这是有意义的。@hc_dev,是的,它与Excel电子表格标题有关。因此,我需要用Java编写一个程序,将字母列名转换为各自的列号。谢谢。我不能进行升级投票,因为我的声誉低于15。所以,字面上是“竖起大拇指”从我这里开始。@dobby,你可能无法投票,但你应该能够接受这个答案,因为这是值得的。干杯!@hc\u dev只是想说,谢谢你在代码上的帮助,特别是给我指点。维基百科链接帮了大忙。我给了你一个投票。再次感谢。向后循环(
I--
)这是一个非常自然和可读的改进。对字符到数字转换的解释并不明显,因为有些同行可能没有像我们@hc_dev,1)那样从Java 1.0开始我对你的答案投了赞成票-你花了你的时间,提供了非常好的解释2)由于我方面的一些技术问题,我的答案提交得比你的晚1)我也对你的答案投了赞成票-你相当简洁地解决了问题,指出了主要原因。2)只是想鼓励你写下你的解释:相对ASCII码=relative栏目号的事情。因为我认为这是这里最难的部分,值得更多的观点/解释。谢谢,@AlexRudenko。我投了赞成票,感谢你的帮助。
    final int asciiOffset = (int) 'A' - 1; // 64 = 65 - 1, so that (int) 'B' - asciiOffset == 2
    long columnNumber = 0;

    for (int backwardsIndex=0; backwardsIndex < columnLabel.length(); backwardsIndex++) {
        char letter = columnLabel.charAt(columnLabel.length() - backwardsIndex -1);
        int letterAsNumber = (int) letter - asciiOffset;
        columnNumber += Math.pow(26, backwardsIndex) * letterAsNumber;
    }

    return columnNumber;
}
n = 31999