题目描述:
给你一个字符串 columnTitle
,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。
分析:
法1,进制转换
这道题要求将Excel 表中的列名称转换成相对应的列序号。由于Excel 表的列名称由大写字母组成,大写字母共有 26 个,因此列名称的表示实质是 26 进制,需要将 26 进制转换成十进制。
当列名称的长度为 n 时,列名称的每个字母都有 26 种不同的取值,因此长度为 n 的不同列名称有 26^n 个。
当 n=1 时,列名称的取值范围是 A 到 Z,分别对应 1 到 26。当 n>1 时,首先得到除了最高位以外的 n−1 位部分对应的列序号,然后考虑最高位对列序号的增量。
上述结论对 n>1 的情况都成立。当 n=1 时,n−1=0,k * 26^(n-1)=k * 1=k,因此 n=1 的情况也适用上述结论。
ord() 返回值ascii是对应的十进制整数。
代码:
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
number, multiple = 0, 1
for i in range(len(columnTitle) - 1, -1, -1):
k = ord(columnTitle[i]) - ord("A") + 1 #与26进制不同,从1开始
number += k * multiple
multiple *= 26 #刚好构成k * 26^n-1
return number
题目描述:
编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null 。
以 任意顺序 返回结果表。
查询结果格式如下所示。
分析:
使用outer join
因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。
考虑到可能不是每个人都有地址信息,我们应该使用outer join,而不是默认的inner join
代码:
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId
;