版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50499601
翻译
给定一个出现在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;
}
};