最近看到粉丝问我一个面试的笔试题,当时看了一下,只想到了大概思路,今天将这个题目分享给大家。
题目:编写一个函数,输入表格列的英文名称,返回其对应的数字序号。如输入A,输出1;输入B,输出2。字母A-Z对应的数字1-26。表格列名和数字的映射关系如下:
A | -> | 1 |
B | -> | 2 |
... | ||
Z | -> | 26 |
AA | -> | 27 |
AB | -> | 28 |
... | ||
AAA | -> | 703 |
AAB | -> | 704 |
... |
分析思路:
''' ** 表示乘方运算 AA 27 = 26**1 + 1 AB 28 = 26**1 + 2 AAA 703 = 26**2 + 26**1 + 1 AAB 704 = 26**2 + 26**1 + 2 '''
从上面可以看出来,同一个字母,在不同的位置,对应的值不一样,字母A在个位对应的是1,在十位对应的是26 ,因此,联想到了进制的移位运算和进制之间的转换,这个题目可以考虑将每一位的值转换成26进制去处理。
步骤一:将字母转换成数字
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19, 'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26}
步骤二:编写函数 实现需求
mapdict = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19, 'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26} def get_excelnumber(str): result = 0 j=0 for i in str[::-1]: result +=26**j*int(mapdict[i]) j=j+1 return result
经过测试,好像能达到效果。就是代码写的比较low,还可以继续优化。有没有bug就需要仔细测试下哈,思路应该是对的。
那个字母与数字的关系可以用python里面的推导式
mapdict ={chr(i+65):i+1 for i in range(26)}
再看看另一种写法(我朋友写的):
编程这东西,还是得多练习,才能写出优雅的代码。