持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
力扣第 88 场双周赛
力扣第 88 场双周赛-力扣
a了三题,2000以内,小上10几分。第一题太离谱了,写O(n)的算法wa了太多次,应该直接暴力的,,,,
这里放一下312的排名,也是wa了8次
2423. 删除字符使频率相同
给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。
如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。
注意:
字母 x 的 频率 是这个字母在字符串中出现的次数。 你 必须 恰好删除一个字母,不能一个字母都不删除。
示例 1
- 输入: word = "abcc"
- 输出: true
- 解释: 选择下标 3 并删除该字母,word 变成 "abc" 且每个字母出现频率都为 1 。
示例 2
- 输入:word = "aazz"
- 输出:false
- 解释:我们必须删除一个字母,所以要么 "a" 的频率变为 1 且 "z" 的频率为 2 ,要么两个字母频率反过来。所以不可能让剩余所有字母出现频率相同。
提示
2 <= word.length <= 100word只包含小写英文字母。
代码
先来看看呆瓜的wawa大合集
下次第一题能暴力则暴力!!!!!!
class Solution {
public boolean equalFrequency(String word) {
int[] arr = new int[26];
for (int i = 0; i < word.length(); i++) {
arr[word.charAt(i) - 'a']++;
}
int[] ints = new int[101];
for (int i = 0; i < 26; i++) {
ints[arr[i]]++;
}
int sum = 0;
for (int i = 1; i < 101; i++) {
if (ints[i] > 0) {
sum++;
if (sum == 3) {
return false;
}
}
}
if (sum == 1) {
if (ints[1] != 0) {
return true;
} else {
for (int i = 1; i < 101; i++) {
if (ints[i]==1) {
return true;
} else if (ints[i] > 1) {
return false;
}
}
}
}
if (ints[1] == 1) {
return true;
}
for (int i = 1; i < 101; i++) {
if (ints[i] > 0) {
return ints[i+1]==1;
}
}
return true;
}
}
暴力解法
真是简单又好懂
class Solution {
public boolean equalFrequency(String word) {
for(int i = 0;i < word.length(); i++){
if(check(word,i)) return true;
}
return false;
}
public boolean check(String word, int index){
int[] arr = new int[26];
for(int i = 0; i< word.length(); i++){
if(i ==index) continue;
else arr[word.charAt(i) - 'a']++;
}
HashSet<Integer> set = new HashSet<>();
for(int i = 0; i < 26; i++) {
set.add(arr[i]);
}
return set.size() < 3;
}
}
2424. 最长上传前缀
给你一个 n 个视频的上传序列,每个视频编号为 1 到 n 之间的 不同 数字,你需要依次将这些视频上传到服务器。请你实现一个数据结构,在上传的过程中计算 最长上传前缀 。
如果 闭区间 1 到 i 之间的视频全部都已经被上传到服务器,那么我们称 i 是上传前缀。最长上传前缀指的是符合定义的 i 中的 最大值 。
请你实现 LUPrefix 类:
LUPrefix(int n) 初始化一个 n 个视频的流对象。 void upload(int video) 上传 video 到服务器。 int longest() 返回上述定义的 最长上传前缀 的长度。
示例 1
输入: ["LUPrefix", "upload", "longest", "upload", "longest", "upload", "longest"]
[[4], [3], [], [1], [], [2], []]
输出:
[null, null, 0, null, 1, null, 3]
解释:
- LUPrefix server = new LUPrefix(4); // 初始化 4个视频的上传流
- server.upload(3); // 上传视频 3 。
- server.longest(); // 由于视频 1 还没有被上传,最长上传前缀是 0 。
- server.upload(1); // 上传视频 1 。
- server.longest(); // 前缀 [1] 是最长上传前缀,所以我们返回 1 。
- server.upload(2); // 上传视频 2 。
- server.longest(); // 前缀 [1,2,3] 是最长上传前缀,所以我们返回 3 。
提示
- 1 <= n <= 105
- 1 <= video <= 105
- video 中所有值 互不相同 。
- upload 和 longest 总调用 次数至多不超过 2 * 105 次。
- 至少会调用 longest 一次。
代码
这个题让我想起了前段时间学的传输协议,应该是回退n帧协议吧,接收方就有一个这个机制来保存i,记录标号i之前的数据都传到了
class LUPrefix {
int index = 0;
int[] arr;
public LUPrefix(int n) {
arr = new int[n + 1];
}
public void upload(int video) {
arr[video - 1]++;
for (int i = index; i < arr.length; i++) {
if (arr[i]==0) {
index = i;
break;
}
}
}
public int longest() {
return index;
}
}
复杂度O(n),因为index最多从1加到n
我把每次更新index放在了upload里面,其实放在longset()里面也是可以的。
实际应用中的话,我认为放在upload中为好,因为别人调用longest的时候,肯定是越快给出返回值越好啦,要不然你还在这一直计算一直计算,那边都等的急死了。
第三题连接如下-2425. 所有数对的异或和
3.结束
第四题还是无从下手,我什么时候能成为四题选手啊!!!!gogogo,刷题刷题,每天一道,三年1000道!!!!