LeetCode 171 Excel Sheet Column Number(Excel的列向表数字)

翻译

给定一个出现在Excel表格上的列表标题,返回它的正确行数。  

例如:
    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 

原文

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:
    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 

分析

有了上一题的经验,这次要容易得多了。它的题意也能理解了,就是从上面的实例左侧字符转换成右侧的数字。大家可以看看上一题:LeetCode 168 Excel Sheet Column Title(Excel的列向表标题)

下面是上一题的博客截图,我举了一个进制转换的例子,但是没有说的很明确,那么就在这一题里充分说明一下好了,大家请继续往下看。

这里写图片描述

这里写图片描述

相信有了这个示例,大家就可以秒懂了。

然后我就写了如下代码:

#include <iostream>
using namespace std;

int exponent(int x, int y) {
    int answer = 1;
    for(int i = 0; i < y; ++ i) {
        answer *= x;
    }
    return answer;
}

int titleToNumber(string s) {
    int n = 0, len = s.length();
    for(int i = 0; i < s.length(); ++ i) {
        char c = s[i];
        int chara = c - 'A' + 1;
        n += chara * exponent(26, len - 1 - i);
    }
    return n;
}

int main() {
    cout<<titleToNumber("AAB");
    return 0;
}

输出结果是

704

这是正确的,后来我改成了如下代码:

#include <iostream>
#include <cmath>
using namespace std;

int titleToNumber(string s) {
    int n = 0, len = s.length();
    for(int i = 0; i < s.length(); ++ i) {
        char c = s[i];
        int chara = c - 'A' + 1;
        n += chara * pow(26, len - 1 - i);
    }
    return n;
}

int main() {
    cout<<titleToNumber("AAB");
    return 0;
}

输出是:

703

于是我就纳闷了,后来我从CodeBlocks换到饿了Visual Studio就成了704了,704是正确的。

这里写图片描述

而在CB中把代码改成:

n += chara * (int)pow(26.0, len - 1 - i);

结果反而成了702了。

希望大家发现问题的在下面留言告诉我啊……

如果换成了double的话,在CB中也是OK的:

#include <iostream>
#include <cmath>
using namespace std;

double titleToNumber(string s) {
    double n = 0, len = s.length();
    for(int i = 0; i < s.length(); ++ i) {
        char c = s[i];
        double chara = c - 'A' + 1;
        double a = len - 1 - i;
        n += chara * pow(26.0, a);
    }
    return n;
}

int main() {
    cout<<titleToNumber("AAB");
    return 0;
}

问题是我好想知道它们在CB和VS内部是如何走的……

代码

class Solution {
public:
    int titleToNumber(string s) {
        int n = 0, len = s.length();
        for (int i = 0; i < s.length(); ++i) {
            char c = s[i];
            int chara = c - 'A' + 1;
            n += chara * pow(26, len - 1 - i);
        }
        return n;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值