给定一个Excel表格中的列名称,返回其相应的列序号。
这就相当于给一个N进制数,求十进制数,只是这个N进制数是用字母表示。基于这种思路,我就写出了第一个算法:先用map表示26个字母对应的数值,然后进行依次求和运算(私下窃喜自己没有单个的赋值每一个字母,而是用了一个循环,但是看了官方说明才发现纯粹是多此一举)
func titleToNumber(columnTitle string) int {
intMapCha := make(map[byte]int, 26)
for i :=0;i<26;i++{
intMapCha['A'+byte(i)] = i +1
}
result := 0
for i:=len(columnTitle)-1;i>=0;i--{
result += intMapCha[columnTitle[i]] * int(math.Pow(26,float64(len(columnTitle)-i-1)))
}
return result
}
看了官方解法以后,发现上面的窃喜纯粹多此一举,遂改正算法,取消这部分的空间消耗,写出代码2.0
func titleToNumber(columnTitle string) int {
result := 0
for i:=len(columnTitle)-1;i>=0;i--{
result += int(columnTitle[i] - 'A' + 1) * int(math.Pow(26,float64(len(columnTitle)-i-1)))
}
return result
}
后来想着,如果当时正好忘记了,math库的求幂次方函数,那该怎么办呢,那就需要每次自己累积这个值,所以有个算法3.0
func titleToNumber(columnTitle string) int {
result := 0
multi := 1
for i:=len(columnTitle)-1;i>=0;i--{
result += int(columnTitle[i] - 'A' + 1) * multi
multi = 26 * multi
}
return result
}