转眼间,来到第十天了!今天这一题是一个和进位法换算相关的题目,会运用到一些ASCII的技巧,是相当有趣的一题,让我们一起来看看吧!
Given a string columnTitle that represents the 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
...
Example 1:
Input: columnTitle = "A"
Output: 1Example 2:
Input: columnTitle = "AB"
Output: 28Example 3:
Input: columnTitle = "ZY"
Output: 701Example 4:
Input: columnTitle = "FXSHRXW"
Output: 2147483647
这题的希望我们做的就是将26进位表示法的整数转换成十进制,这边的26进位比较特别的是前十个并不是用数字来表示,而是英文大写字母A-Z,所以我们要回传的就是相对应的整数。
根据进位法的定义,我们可以得知十进位中的个位数是「在个位的数字10的0次方」、十位数是「十位数字10的1次方」依此类推,在二十六进制中也是相同的道理,个位数是「在个位的数字26的0次方」、十位数是「十位数字26的1次方」......,OK 那我们就可以用这个逻辑去做这一题。
可是重点来了,我们要怎麽知道A代表1,Z代表26,在起初我做这题的时候,是想到建立一个阵列或是HashMap,使其能够一一对应,但後来突然想到,对电脑来说字母其实也是数字,也就是所谓的ASCII Code,那为何不用这个特性来达到A-Z => 1~26 的转换,只要将A(ASCII中的65)转换成整数并减去64,就变成1了,其余的也一一对应,因此在我的算法中,的确就是使用到ASCII Code与for回圈,按照定义将结果累加出来并回传。
以下是python3的程序码
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
total = 0
for i, v in enumerate(columnTitle[::-1]):
total += (ord(v)-64) * (26 ** i) # ASCII转换成数字
return total
以下是C++的程序码
class Solution {
public:
int titleToNumber(string columnTitle) {
int count=0;
int size = columnTitle.size();
for(int i=0;i<size;i++){
int o = columnTitle[size-(i+1)];
count += (o-64) * (pow(26, i));
}
return count;
}
};
以下也是C++的程序码,但这个方法通过了优化回圈进行方式,来达到不需要呼叫指数函式,会更节省空间与加强效率。
class Solution {
public:
int colCharToInt( char ch ) {
return ( ch - 'A' + 1 );
}
int titleToNumber(string columnTitle) {
int currNum = 0;
for( int i = 0; i < columnTitle.size(); i++ ) {
int currVal = colCharToInt( columnTitle[i] );
currNum = currNum * 26 + currVal;
}
return currNum;
}
};
<<: Day 13 - Slide In on Scroll
>>: Day 8:工欲善其事,必先利其器,准备好Gradle依赖
那麽今天来试着弄出用"空白建"控制物件跳跃的脚本内容吧! 那之前因为都是平面移动,所以我是想着改变座...
Cursor and Zoom-in 今天继续增加图表功能,其中两个很常需要的功能就是游标和区域放...
看到这里,你可能还是很疑惑,到底 vim 好用在哪?嘿嘿,那是因为强大的外挂还没装啦!网路上会有一些...
连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...
接下来我们建立後续章节要使用的练习专案,我预想了一个「购物车及运费计算机」做为情境,整个流程会示范如...