这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
题1
Excel表列序号
给你一个字符串 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 示例 4:
-
输入: columnTitle = "FXSHRXW"
-
输出: 2147483647
提示:
- 1 <= columnTitle.length <= 7
- columnTitle 仅由大写英文组成
- columnTitle 在范围 ["A", "FXSHRXW"] 内 相关标签
- 数学
- 字符串
本题就是一个找规律的题,对字母进行ord 然后进行26进制转化 最后寻求结果
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
num = len(columnTitle)
ans = 0
for row in columnTitle:
ans += 26**(num-1)*(ord(row)-64)
num -= 1
return ans
执行结果:
题2
四数相加 II
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
- 0 <= i, j, k, l < n
- nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
-
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
-
输出:2 解释:
-
两个元组如下:
-
- (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
-
- (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0 示例 2:
-
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
-
输出:1
** 提示:**
- n == nums1.length
- n == nums2.length
- n == nums3.length
- n == nums4.length
- 1 <= n <= 200
- -228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228 相关标签
- 数组
- 哈希表
思路: 分组、计数
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
doc = dict()
res = 0
for i in nums1:
for j in nums2:
if i + j in doc:
doc[i + j] += 1
else:
doc[i + j] = 1
for k in nums3:
for l in nums4:
if - k - l in doc:
res += doc[- k - l]
return res
执行结果:
题3
常数时间插入、删除和获取随机元素
实现RandomizedSet 类:
- RandomizedSet() 初始化 RandomizedSet 对象
- bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
- bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
- int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
- 你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。
示例:
输入
- ["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
- [[], [1], [2], [2], [], [1], [2], []] 输出
- [null, true, false, true, 2, true, false, 2]
解释
- RandomizedSet randomizedSet = new RandomizedSet();
- randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
- randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
- randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
- randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
- randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
- randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
- randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。
提示:
- -231 <= val <= 231 - 1
- 最多调用 insert、remove 和 getRandom 函数 2 * 105 次
- 在调用 getRandom 方法时,数据结构中 至少存在一个 元素。 相关标签
- 设计
- 数组
- 哈希表
- 数学
- 随机化
思路: 列表 & 字典
class RandomizedSet:
def __init__(self):
self.nums1 = {}
self.nums2 = []
def insert(self, val: int) -> bool:
if val in self.nums1:
return False
self.nums1[val] = len(self.nums2)
self.nums2.append(val)
return True
def remove(self, val: int) -> bool:
if val in self.nums1:
idx, tail = self.nums1[val], self.nums2[-1]
self.nums2[idx], self.nums1[tail] = tail, idx
self.nums2.pop()
del self.nums1[val]
return True
return False
def getRandom(self) -> int:
return self.nums2[random.randrange(0,len(self.nums2))]
# Your RandomizedSet object will be instantiated and called as such:
# obj = RandomizedSet()
# param_1 = obj.insert(val)
# param_2 = obj.remove(val)
# param_3 = obj.getRandom()
执行结果: