Leetcode 挑战 Day 10 [171. Excel Sheet Column Number]

171. Excel Sheet Column Number


转眼间,来到第十天了!今天这一题是一个和进位法换算相关的题目,会运用到一些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: 1

Example 2:
Input: columnTitle = "AB"
Output: 28

Example 3:
Input: columnTitle = "ZY"
Output: 701

Example 4:
Input: columnTitle = "FXSHRXW"
Output: 2147483647

这题的希望我们做的就是将26进位表示法的整数转换成十进制,这边的26进位比较特别的是前十个并不是用数字来表示,而是英文大写字母A-Z,所以我们要回传的就是相对应的整数。

ASCII and ForLoop


根据进位法的定义,我们可以得知十进位中的个位数是「在个位的数字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依赖

Unity自主学习(二十七):物件跳跃

那麽今天来试着弄出用"空白建"控制物件跳跃的脚本内容吧! 那之前因为都是平面移动,所以我是想着改变座...

Day12 再靠近一点点 就不闪躲

Cursor and Zoom-in 今天继续增加图表功能,其中两个很常需要的功能就是游标和区域放...

Day 15:vim 外挂大杂烩

看到这里,你可能还是很疑惑,到底 vim 好用在哪?嘿嘿,那是因为强大的外挂还没装啦!网路上会有一些...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day29 搜寻文章

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

第九天:建立练习专案

接下来我们建立後续章节要使用的练习专案,我预想了一个「购物车及运费计算机」做为情境,整个流程会示范如...