【模拟】第一个出现两次的字母
题目
给你一个由小写英文字母组成的字符串 s
,请你找出并返回第一个出现 两次 的字母。
注意:
- 如果
a
的 第二次 出现比b
的 第二次 出现在字符串中的位置更靠前,则认为字母a
在字母b
之前出现两次。 s
包含至少一个出现两次的字母。
示例 1:
|
|
示例 2:
|
|
提示:
2 <= s.length <= 100
s
由小写英文字母组成s
包含至少一个重复字母
解题思路
简单模拟即可
代码
|
|
【枚举+哈希】相等行列对
题目
给你一个下标从 0 开始、大小为 n x n
的整数矩阵 grid
,返回满足 Ri
行和 Cj
列相等的行列对 (Ri, Cj)
的数目*。*
如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。
示例 1:
|
|
示例 2:
|
|
提示:
n == grid.length == grid[i].length
1 <= n <= 200
1 <= grid[i][j] <= 10^5
解题思路
数据范围不大,枚举比较
利用哈希降时间复杂度
代码
|
|
【模拟】设计食物评分系统
题目
设计一个支持下述操作的食物评分系统:
- 修改 系统中列出的某种食物的评分。
- 返回系统中某一类烹饪方式下评分最高的食物。
实现 FoodRatings
类:
FoodRatings(String[] foods, String[] cuisines, int[] ratings)
初始化系统。食物由foods
、cuisines
和ratings
描述,长度均为n
foods[i]
是第i
种食物的名字。cuisines[i]
是第i
种食物的烹饪方式。ratings[i]
是第i
种食物的最初评分。
void changeRating(String food, int newRating)
修改名字为food
的食物的评分。String highestRated(String cuisine)
返回指定烹饪方式cuisine
下评分最高的食物的名字。如果存在并列,返回 字典序较小 的名字。
注意,字符串 x
的字典序比字符串 y
更小的前提是:x
在字典中出现的位置在 y
之前,也就是说,要么 x
是 y
的前缀,或者在满足 x[i] != y[i]
的第一个位置 i
处,x[i]
在字母表中出现的位置在 y[i]
之前。
示例:
|
|
提示:
1 <= n <= 2 * 10^4
n == foods.length == cuisines.length == ratings.length
1 <= foods[i].length, cuisines[i].length <= 10
foods[i]
、cuisines[i]
由小写英文字母组成1 <= ratings[i] <= 10^8
foods
中的所有字符串 互不相同- 在对
changeRating
的所有调用中,food
是系统中食物的名字。 - 在对
highestRated
的所有调用中,cuisine
是系统中 至少一种 食物的烹饪方式。 - 最多调用
changeRating
和highestRated
总计2 * 10^4
次
解题思路
和这周双周赛T3类似
WA了一发和上次同样的原因,val为空时,没有将该键值对erase掉
代码
|
|
【思维】优质数对的数目
题目
给你一个下标从 0 开始的正整数数组 nums
和一个正整数 k
。
如果满足下述条件,则数对 (num1, num2)
是 优质数对 :
num1
和num2
都 在数组nums
中存在。num1 OR num2
和num1 AND num2
的二进制表示中值为 1 的位数之和大于等于k
,其中OR
是按位 或 操作,而AND
是按位 与 操作。
返回 不同 优质数对的数目。
如果 a != c
或者 b != d
,则认为 (a, b)
和 (c, d)
是不同的两个数对。例如,(1, 2)
和 (2, 1)
不同。
注意: 如果 num1
在数组中至少出现 一次 ,则满足 num1 == num2
的数对 (num1, num2)
也可以是优质数对。
示例 1:
|
|
示例 2:
|
|
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
1 <= k <= 60
解题思路
num1 or num2
和num1 and num2
的二进制中值为1的位数之和 与
num1
和num2
的二进制中值为1的位数之和 等价
把二进制数看成集合,根据容斥原理$|A\cup B|=|A|+|B|-|A\cap B|$得
$|A\cup B|+|A\cap B|=|A|+|B|$
代码
|
|
偷学代码
|
|