这题是真的简单了,分分钟的事,所以本文当然不是讲这题的算法思路啥的。我想学python,所以这题是讲怎么用python实现的。实现的方法有很多,python应该也可以和C/C++一样,通过数组下标来操作字符数组,这样就没什么好说的了,所以我们这题用python独有的方法来做。
class Solution:
# @param {string} s
# @return {integer}
def titleToNumber(self, s):
return reduce(lambda r, c:26*r+ord(c)-ord('A')+1, s, 0)
实际代码只有一行。python经常能做到这种效果,常常一行代码(即使是很长的一行)就行,当然,C/C++也可以用逗号表达式什么的达到这种效果,不过并不推荐这么做,代码的可读性还是非常重要的。我初学python,感觉python使用起来确实比较方便,不用像C/C++一样关心很多细节,有时甚至能给我一种在进行声明式编程的感觉。同时python也有很多类库,用C/C++做起来比较麻烦的事,用python常常很方便地就能做到。当然,并不是说C/C++不好,它们的优点本来就不在于易学易用(我应该算是C/C++粉)。总之,目前来看python还是一门比较值得学习的语言。
好了,下面开始进入正题,解释这区区一行代码。
python是动态类型语言,所以在编译时或者光看部分代码不一定能确定变量的类型,因此函数的参数s和返回值类型要单独在注释中说明。这一行代码中调用了reduce函数,此函数有三个参数,第三个参数是可选的。第一个参数是一个二元函数,用来对第二个参数指明的序列中的元素进行计算,若有第三个参数,则用这个参数指明的值作为初始值进行计算。具体到本题的这行代码来说,先用初始值0作为lambda函数的第一个参数r,再从字符串s中取出一个元素作为lambda函数的第二个参数c,然后按照lambda函数的定义进行计算,计算完成后,将结果再作为lambda函数的第一个参数,再从s中取出一个元素,重复这些步骤,直到s中的所有元素都计算过。
再来解释lambda函数。
python中的lambda函数相当于一个临时函数,常常很短,只有一行,声明定义和使用可以同时进行,不需要像C/C++要先进行函数声明和定义,再另写若干行代码进行函数调用,Java中也有类似的用法,在需要类对象作为参数的某些地方,可以定义一个临时对象并覆盖接口方法,用这个临时对象作为实参进行函数调用。我不知道C/C++中有没有类似的用法,关于lambda函数的详细说明也请参看相关手册。在这里,这个lambda函数有两个参数r和c,用这两个参数计算某个值,“:”后是lambda函数体,其中ord()函数负责将一个字符转为相应的整型值,然后返回计算结果。整个lambda函数作为reduce函数的第一个参数,不要看见三个逗号就以为是四个参数啦。
好了,这就是python,在基本语法上还是和C系语言蛮相似的,但也有很多高级有趣且方便的语法,值得一用~