📖本文目录
🙊写在前面
🙊小付来喽,今天接着有更新周赛栏目了哦,今天小付第7次打单周赛
📆第282场周赛——2022-02-27
📝T1.6008. 统计包含给定前缀的字符串
题目
示例
示例1:
输入:words = ["pay","attention","practice","attend"], pref = "at"
输出:2
解释:以 "at" 作为前缀的字符串有两个,分别是:"attention" 和 "attend" 。
示例2:
输入:words = ["leetcode","win","loops","success"], pref = "code"
输出:0
解释:不存在以 "code" 作为前缀的字符串。
提示
1 <= words.length <= 100
1 <= words[i].length, pref.length <= 100
words[i] 和 pref 由小写英文字母组成
⭐思路 ⭐
本题思路以及考察点:
- 字符串模拟,
暴力AC题
代码实现
class Solution {
public int prefixCount(String[] words, String pref) {
int res = 0;
int n = pref.length();
// 遍历字符串数组
for (String s : words){
// 如果当前的字符串长度都小于了前缀字符串长度则跳过
if (s.length() < n)continue;
// 获取当前字符串的前缀长度子串进行比较 记录结果
if (s.substring(0,n).equals(pref))res++;
}
return res;
}
}
执行结果
📝T2.6009. 使两字符串互为字母异位词的最少步骤数
题目
示例
示例1:
输入:s = "leetcode", t = "coats"
输出:7
解释:
- 执行 2 步操作,将 "as" 追加到 s = "leetcode" 中,得到 s = "leetcodeas" 。
- 执行 5 步操作,将 "leede" 追加到 t = "coats" 中,得到 t = "coatsleede" 。
"leetcodeas" 和 "coatsleede" 互为字母异位词。
总共用去 2 + 5 = 7 步。
可以证明,无法用少于 7 步操作使这两个字符串互为字母异位词。
示例2:
输入:s = "night", t = "thing"
输出:0
解释:给出的字符串已经互为字母异位词。因此,不需要任何进一步操作。
提示
1 <= s.length, t.length <= 2 * 10^5
s 和 t 由小写英文字符组成
⭐思路 ⭐
本题思路以及考察点:
- 简单的哈希表计数问题,我们可以分别记录字符串1 和 字符串2 中
各个字符串出现的次数
。 - 然后我们通过
对每个字符哈希表进行筛选模拟即可
代码实现
class Solution {
public int minSteps(String s, String t) {
// 构建哈希表分别用于记录s字符串和t字符串的各个字符出现的个数
Map<Character,Integer> sMap = new HashMap<>();
Map<Character,Integer> tMap = new HashMap<>();
// 初始化
for (char c : s.toCharArray()){
sMap.put(c,sMap.getOrDefault(c,0)+1);
}
for (char c : t.toCharArray()){
tMap.put(c,tMap.getOrDefault(c,0)+1);
}
// 用于记录结果
int res = 0 ;
for (char c:sMap.keySet()){
// 如果s字符串中的字符在t字符串中出现 且数量相等则跳过当前字符
if (tMap.containsKey(c) && tMap.get(c).equals(sMap.get(c)))continue;
// 如果s中存在该字符而t中不存在该字符 则将出现的该字符以及它的数量添加到t字符哈希表中
if (!tMap.containsKey(c)){
tMap.put(c,sMap.get(c));
// 记录结果
res+=sMap.get(c);
}
// 如果当前存在了相同的字符 则需要添加使得两个字符串中该字符相等数量的字符
if (tMap.containsKey(c)){
res += Math.abs(tMap.get(c) - sMap.get(c));
}
}
// 还需要额外进行遍历一次t字符串 以防t字符串中出现了s中没出现的字符
for (char c : tMap.keySet()){
if (!sMap.containsKey(c)){
sMap.put(c,tMap.get(c));
res+=tMap.get(c);
}
}
return res;
}
}
执行结果
📝T3.6010. 完成旅途的最少时间
题目
示例
示例1:
输入:time = [1,2,3], totalTrips = 5
输出:3
解释:
- 时刻 t = 1 ,每辆公交车完成的旅途数分别为 [1,0,0] 。
已完成的总旅途数为 1 + 0 + 0 = 1 。
- 时刻 t = 2 ,每辆公交车完成的旅途数分别为 [2,1,0] 。
已完成的总旅途数为 2 + 1 + 0 = 3 。
- 时刻 t = 3 ,每辆公交车完成的旅途数分别为 [3,1,1] 。
已完成的总旅途数为 3 + 1 + 1 = 5 。
所以总共完成至少 5 趟旅途的最少时间为 3 。
输入:time = [2], totalTrips = 1
输出:2
解释:
只有一辆公交车,它将在时刻 t = 2 完成第一趟旅途。
所以完成 1 趟旅途的最少时间为 2 。
提示
1 <= time.length <= 10^5
1 <= time[i], totalTrips <= 10^7
⭐思路 ⭐
本题思路以及考察点:
- 我们先来理解一下题意,它是需要让我们求出完成
至少 totalTrips
趟旅途需要花费的 最少 时间, 我们可以先将这个车辆行驶时间进行排序
通过计算time[0] * totalTrips
,从而获得得到 旅途花费的 最多 时间,因为当有其他车辆在花费时间最多之内也能跑完则会使得车次跑完旅途的次数+1。
代码实现
class Solution {
public long minimumTime(int[] time, int totalTrips) {
Arrays.sort(time);
long left = 0;
// 记录当前最大完成旅途的时间
long right = 1L* time[0] * totalTrips ;
// 在最小时间和最大时间之间搜索符合条件的时间
while (left < right ){
long mid = left + (right - left) /2;
// 记录当前完成旅途的车
long trips = 0;
// 遍历每个车次需要完成的时间
for(int t : time){
if(mid < t){
break;
}
// 记录当前时间能完成的趟数
trips += mid / t;
}
// 如果当前完成的车次已经到达了完成的次数则缩小范围 搜索前面时间范围
if(trips >= totalTrips){
right = mid;
} else {
// 反之搜索后面时间范围
left = mid + 1;
}
}
return left;
}
}
执行结果
🙊写在最后
小付打卡的第7场单周赛 2022-02-27
尽可能把会做的题 都做好 就可以了
本次周赛 对了两道题
T3 超时 T4 没有摸到=-=
所以还是很不错的周赛体验
最后
每天进步点 每天收获点
愿诸君 事业有成 学有所获
如果觉得不错 别忘啦一键三连哦~