力扣刷题-借助哈希完成一次遍历
3185构成整天的下标对数目
给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j 且 hours[i] + hours[j] 构成 整天 的下标对 i, j 的数目。
整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推。
这道题目,需要用哈希,来存储出现次数,循环每遇到一个元素,就把该元素除余24的数保存到变量t中,然后在哈希中找是否存在与t相加为24的倍数的数,如果有,就加上这个数的出现次数,最后更新哈希,把t放进哈希并次数加一。
python代码如下:
class Solution:
def countCompleteDayPairs(self, hours: List[int]) -> int:
cnt = Counter()
count = 0
for i, x in enumerate(hours):
t = x % 24
target = (24 - t) % 24
count += cnt[target]
cnt[t] += 1
return count
2506统计相似字符串对的数目
给你一个下标从 0 开始的字符串数组 words 。
如果两个字符串由相同的字符组成,则认为这两个字符串 相似 。
- 例如,
"abca"和"cba"相似,因为它们都由字符'a'、'b'、'c'组成。 - 然而,
"abacba"和"bcfd"不相似,因为它们不是相同字符组成的。
请你找出满足字符串 words[i] 和 words[j] 相似的下标对 (i, j),并返回下标对的数目,其中 0 <= i < j <= words.length - 1 。
这道题目先借用集合的性质,集合中元素不重复,所以循环遍历数组,每遇到一个单词就把单词这个字符串转化为集合,这样可以去除相同的字符,然后把这个去重的字符串排序,需要先转化为列表排序然后再转为字符串,然后查该字符串是否存在与哈希中,如果有,就加上这个次数,最后更新哈希,即次数加一。
python代码如下:
class Solution:
def similarPairs(self, words: List[str]) -> int:
cnt=Counter()
count=0
for i,x in enumerate(words):
s=set(x)
sorteds=str(sorted(list(s)))
if sorteds in cnt:
count+=cnt[sorteds]
cnt[sorteds]+=1
return count
