
【模拟】第一个出现两次的字母
题目
给你一个由小写英文字母组成的字符串 s ,请你找出并返回第一个出现 两次 的字母。
注意:
- 如果
a的 第二次 出现比b的 第二次 出现在字符串中的位置更靠前,则认为字母a在字母b之前出现两次。 s包含至少一个出现两次的字母。
示例 1:
| |
示例 2:
| |
提示:
2 <= s.length <= 100s由小写英文字母组成s包含至少一个重复字母
解题思路
简单模拟即可
代码
| |
【枚举+哈希】相等行列对
题目
给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目*。*
如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。
示例 1:
| |
示例 2:
| |
提示:
n == grid.length == grid[i].length1 <= n <= 2001 <= grid[i][j] <= 10^5
解题思路
数据范围不大,枚举比较
利用哈希降时间复杂度
代码
| |
【模拟】设计食物评分系统
题目
设计一个支持下述操作的食物评分系统:
- 修改 系统中列出的某种食物的评分。
- 返回系统中某一类烹饪方式下评分最高的食物。
实现 FoodRatings 类:
FoodRatings(String[] foods, String[] cuisines, int[] ratings)初始化系统。食物由foods、cuisines和ratings描述,长度均为nfoods[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^4n == foods.length == cuisines.length == ratings.length1 <= foods[i].length, cuisines[i].length <= 10foods[i]、cuisines[i]由小写英文字母组成1 <= ratings[i] <= 10^8foods中的所有字符串 互不相同- 在对
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^51 <= nums[i] <= 10^91 <= 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|$
代码
| |
偷学代码
| |
