本文共 1551 字,大约阅读时间需要 5 分钟。
题目大意:
给定一个Excel表格中的列名称,返回其相应的列序号。
例如,
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
示例 1:
输入: "A"输出: 1
示例 2:
输入: "AB"输出: 28
示例 3:
输入: "ZY"输出: 701
从A-Z对应1-26,当列标题进一位变成AA时,列对应的数字变成27。这是一个26进制转换成10进制的问题,不过A对应的是1而不是0。ZY=26*26+25*1=701
class Solution(object): def titleToNumber(self, s): """ :type s: str :rtype: int """ result = 0 for letter in s: result = result * 26 + ord(letter) - ord('A') + 1#转换之后把大写字母对应的数字转化为小写字母。 # ord()函数用来获得字符对应的ASCII数值 return result
知识点:
ord() 函数 是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
语法:
ord( c )
c – 字符。 返回值:对应的十进制整数。
实例:
>>>ord('a')97>>>ord('b')98>>>ord('c')99
以下是Java版本:
分析如下:
本题就是A-Z代表26进制的数,计算出26进制字符串对于的10进制数.
这里用到一个数学函数Math.pow(a,b)=a的b次幂,即Math.pow(26,len-1-i)代表26的(len-1-i)次幂
//类似于计算26进制数的10进制结果public class Solution { public int titleToNumber(String s) { //s中字符个数 int len=s.length(); //保存最终结果 int result=0; //从个位数开始累加计算 for(int i=len-1;i>=0;i--){ //Math.pow(a,b)是计算a的b次幂,这里底数是26 result+=(s.charAt(i)-'A'+1)*Math.pow(26,len-1-i); } return result; }}
本质就是将一个26进制的数,转换成10进制的数。
public class Solution { public int titleToNumber(String s) { int result = 0; for (int i = 0; i < s.length(); i++) { result = result * 26 + (s.charAt(i) - 'A' + 1); } return result; }}
转载地址:http://cpuvi.baihongyu.com/