[杨小白]_leetcode_力扣第 88 场双周赛-第一、二题

68 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

力扣第 88 场双周赛

力扣第 88 场双周赛-力扣

a了三题,2000以内,小上10几分。第一题太离谱了,写O(n)的算法wa了太多次,应该直接暴力的,,,,

image.png

这里放一下312的排名,也是wa了8次 image.png

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 <= 100
  • word 只包含小写英文字母。

代码

先来看看呆瓜的wawa大合集

image.png

下次第一题能暴力则暴力!!!!!!

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

image.png

我把每次更新index放在了upload里面,其实放在longset()里面也是可以的。

实际应用中的话,我认为放在upload中为好,因为别人调用longest的时候,肯定是越快给出返回值越好啦,要不然你还在这一直计算一直计算,那边都等的急死了。

第三题连接如下-2425. 所有数对的异或和

3.结束

第四题还是无从下手,我什么时候能成为四题选手啊!!!!gogogo,刷题刷题,每天一道,三年1000道!!!!