leetcode:Excel表列序号(详解)

前言:内容包括:题目,代码实现,大致思路,代码解读,26进制数字转对应字母 与 字母转对应26进制数字的方法总结

题目:

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...
 

示例 1:

输入: columnTitle = "A"
输出: 1
示例 2:

输入: columnTitle = "AB"
输出: 28
示例 3:

输入: columnTitle = "ZY"
输出: 701
 

提示:

1 <= columnTitle.length <= 7
columnTitle 仅由大写英文组成
columnTitle 在范围 ["A", "FXSHRXW"] 内

代码实现:

int titleToNumber(char * columnTitle)
{
    int len = strlen(columnTitle);
	int arr[7] = { 0 };
	int i = 0;
	for (i = len - 1; i >= 0; i--)
	{
		arr[i] = columnTitle[i] - 'A' + 1;
	}

	int sum = 0;
	for (i = 0; i < len; i++)
	{
		sum += pow(26, len - 1 - i) * arr[i];
	}
	return sum;
}

大致思路:

正常的26进制:0~25

转成对应字母:A~Z    (0~25的每个数字转成其对应的字母:此数字+'A')

比如:0---->A  (0+A = A     因为A的ASCII码值是65,0+65 = 65)

          1----->B (1+A = B     因为B的ASCII码值是66,1+65 = 66)

A~Z转成对应的26进制的数字(0~25):此字母-'A'

比如 A---->0   (A-A = 0)

        B--->1     (B-A = 1)

1 从后往前遍历这个字符串,将每个字符转成对应的26进制的数字(0~25之间的数字)

   但是题目是在原有的进制基础上,使得每一位数字+1,比如:

   0----->1   1---->2  

所以我们得到26进制的数字后,需要再对其+1,就能得到符合题意设定的数字

然后将其存入arr数组中

   字母-'A' = 对应的26进制数字(0~25之间的数字)

2 遍历arr数组,模仿26进制数字的计算方法:

leetcode:Excel表列序号(详解)_第1张图片

 需要使用幂函数pow得到26的幂次方

代码解读:

part 1

    int len = strlen(columnTitle);
	int arr[7] = { 0 };//存放每一个字母转成的符合题意要求的数字
	int i = 0;
	for (i = len - 1; i >= 0; i--)
	{
		arr[i] = columnTitle[i] - 'A' + 1;
	}

遍历整个字符串,每得到一个字母,将其转成符合题意要求的对应数字:
比如:AB

得到B:B对应的26进制的数字是1(B-A = 1)

             但是在题目中,B要对应2,所以1还需+1,变成2

得到A:A对应的26进制的数字是0(A-A = 0)

             但是在题目中,A要对应1,所以0还需+1,变成1

part 2

    int sum = 0;
	for (i = 0; i < len; i++)
	{
		sum += pow(26, len - 1 - i) * arr[i];
	}
	return sum;

遍历arr数组:arr数组中存放的是1,2

leetcode:Excel表列序号(详解)_第2张图片

26进制数字转对应字母 与 字母转对应26进制数字的方法总结

字母转对应26进制数字:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

输入:A 得到1

输入:AB 得到28

方法:

 1 将每一个字母转成对应的26进制数字(0~25):字母-'A'

 2 将由1得到的数字再+1 即可得到符合上述规律的对应数字

比如:A--->0(A-A) --->1(0+1)

          B--->1  (B-A)--->2(1+1)

26进制数字转对应字母

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

输入:1 得到 A

输入:28 得到 AB

方法:

1 在得到此数的每一位之前,此数都需要-1,这样得到的每一位就是26进制的数字(0~25)

2 将由1得到的26进制的数字+'A' 即可得到对应的字母

比如:28

28-1 = 27:得到最低位的数字:27%26 = 1     

                  转成对应字母:        1+A = B

27/=26 = 1:去掉最低位

1 - 1 = 0:得到一位数字:0%26 = 0     

                 转成对应字母:0+A = A

结果:AB   

你可能感兴趣的:(leetcode,c语言)