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,从低位到高位,每次把字母转换成数字后,乘以该数位的权重,权重在低位为1,从右往左每次权重也乘以26。这也是为什么从低位向高位遍历的原因,低位的权重已知,高位的权重再没访问之前是不知道的。 2. 再次说明,搞清问题的边界的具体位置,也就搞清了答案。或者形象的说,答案在问题的背后,但是没搞清楚问题的边界,那么问题在头脑里就是一团浆糊,显得没有边界,没有边界给人的感觉就是边界无穷大,当然从自己的角度看过去这个问题就大得遮住了答案,看不到一点答案的样子;但是一旦学会了去定义问题的界限,发现问题方方面面的边沿,问题就逐渐从“无穷大”缩减到这个问题实际的大小,那么答案就在他的背后,可以看得清清楚楚。当然,值得强调的是,实际上问题本身没有什么变化,不会变小,而是自己看问题的感受发生变化。比如,这道题低位的权重是1,这就是一个边界,而且是已知的,而高位的边界虽然可以获得,但是并不是已知! 3. 上面说从低位开始遍历,因为边界清晰,所以好理解。但这并不妨碍从另一个角度来考虑问题,如果把这个转换的过程建模成一下的方式:ABC={(A-‘A’+1)*26+(B-‘A’+1)}*26+(C-‘A’+1)。看起来又是数学技巧,但是这里面展现的数学之美让人动容。你看,我们通过提取公因数,就可以从左边遍历至右边。每次把当前的结果乘以26,然后加上当前位的数,由于每次的中间结果都乘以26,所以,最高位就乘了n-1次26,因此这是正确的操作! 4. 再说一下两者数学的不同:前者是乘数和被乘数相互独立,权重每次自己相乘26即可,简单干练,逻辑清楚,因为就是一个线性的思路;后者则是把整个中间结果乘以26,关键是这个结构是一种自重复的结构,即:公式内部的一部分长得和公式自己一样,有点分形图案的味道,天然用iterative实现。 5. 再分析,从左往右运算的方法:由于先把计算最重要,权重最高的位置,所以更稳定;从右往左的方法,则稳定性差。所谓稳定性,就是如果计算从中间停止,所计算的结果和最后结果之间的差值大小。
//方法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; }};新闻热点
疑难解答