LeetCode 171 Excel Sheet Column Number(Excel的列向表數字)
阿新 • • 發佈:2019-01-08
翻譯
給定一個出現在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
分析
下面是上一題的部落格截圖,我舉了一個進位制轉換的例子,但是沒有說的很明確,那麼就在這一題裡充分說明一下好了,大家請繼續往下看。
相信有了這個示例,大家就可以秒懂了。
然後我就寫了如下程式碼:
#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;
}
};