Related to question Excel Sheet Column Title
Given a column title as appear in an Excel sheet, return its corresponding column number.
For example:
A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28s思路: 1. 逆向題。例如:ABC=(C-‘A’+1)*1+(B-‘A’+1)*26+(A-‘A’+1)*26*26,從低位到高位,每次把字母轉(zhuǎn)換成數(shù)字后,乘以該數(shù)位的權(quán)重,權(quán)重在低位為1,從右往左每次權(quán)重也乘以26。這也是為什么從低位向高位遍歷的原因,低位的權(quán)重已知,高位的權(quán)重再沒訪問之前是不知道的。 2. 再次說明,搞清問題的邊界的具體位置,也就搞清了答案?;蛘咝蜗蟮恼f,答案在問題的背后,但是沒搞清楚問題的邊界,那么問題在頭腦里就是一團(tuán)漿糊,顯得沒有邊界,沒有邊界給人的感覺就是邊界無窮大,當(dāng)然從自己的角度看過去這個問題就大得遮住了答案,看不到一點答案的樣子;但是一旦學(xué)會了去定義問題的界限,發(fā)現(xiàn)問題方方面面的邊沿,問題就逐漸從“無窮大”縮減到這個問題實際的大小,那么答案就在他的背后,可以看得清清楚楚。當(dāng)然,值得強調(diào)的是,實際上問題本身沒有什么變化,不會變小,而是自己看問題的感受發(fā)生變化。比如,這道題低位的權(quán)重是1,這就是一個邊界,而且是已知的,而高位的邊界雖然可以獲得,但是并不是已知! 3. 上面說從低位開始遍歷,因為邊界清晰,所以好理解。但這并不妨礙從另一個角度來考慮問題,如果把這個轉(zhuǎn)換的過程建模成一下的方式:ABC={(A-‘A’+1)*26+(B-‘A’+1)}*26+(C-‘A’+1)??雌饋碛质菙?shù)學(xué)技巧,但是這里面展現(xiàn)的數(shù)學(xué)之美讓人動容。你看,我們通過提取公因數(shù),就可以從左邊遍歷至右邊。每次把當(dāng)前的結(jié)果乘以26,然后加上當(dāng)前位的數(shù),由于每次的中間結(jié)果都乘以26,所以,最高位就乘了n-1次26,因此這是正確的操作! 4. 再說一下兩者數(shù)學(xué)的不同:前者是乘數(shù)和被乘數(shù)相互獨立,權(quán)重每次自己相乘26即可,簡單干練,邏輯清楚,因為就是一個線性的思路;后者則是把整個中間結(jié)果乘以26,關(guān)鍵是這個結(jié)構(gòu)是一種自重復(fù)的結(jié)構(gòu),即:公式內(nèi)部的一部分長得和公式自己一樣,有點分形圖案的味道,天然用iterative實現(xiàn)。 5. 再分析,從左往右運算的方法:由于先把計算最重要,權(quán)重最高的位置,所以更穩(wěn)定;從右往左的方法,則穩(wěn)定性差。所謂穩(wěn)定性,就是如果計算從中間停止,所計算的結(jié)果和最后結(jié)果之間的差值大小。
//方法1:從低位向高位遍歷class Solution {public: int titleToNumber(string s) { // int res=0,w=1; for(int i=s.size()-1;i>=0;i--){ res+=(s[i]-'A'+1)*w; w*=26; } return res; }};//方法2:從高低位向低位遍歷class Solution {public: int titleToNumber(string s) { // int res=0; for(int i=0;i<s.size();i++){ res=res*26+(s[i]-'A'+1); } return res; }};新聞熱點
疑難解答