leetcode每周周赛第277场周赛 排序理解+双指针数组+哈希表映射 简单与中等 简单周赛你不来试试么~

📖本篇内容:leetcode每周周赛第277场周赛 排序理解+双指针数组+哈希表映射 简单与中等

📑 文章专栏:leetcode周赛打卡《周周打卡》

📆 最近更新:2022年1月16日 leetcode每周.周赛第277场周赛

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊写在前面🙊

🙊小付来喽,今天接着有更新周赛栏目了哦,今天小付第二次打周赛,相对之前,也有了不少的改进,也不会因为acm模式而生疏,每周都来加深一下现如今的部分企业对基础算法的要求等,今天战果和上周一样都是三题,话不多说,来看看这第277场周赛,有些什么妖魔鬼怪题。

📆第277场周赛——2022-01-23📆

📝T1.[5989. 元素计数]

题目

给你一个整数数组 nums ,统计并返回在 nums 中同时具有一个严格较小元素和一个严格较大元素的元素数目。

示例

示例1:

输入:nums = [11,7,2,15]
输出:2
解释:元素 7 :严格较小元素是元素 2 ,严格较大元素是元素 11 。
元素 11 :严格较小元素是元素 7 ,严格较大元素是元素 15 。
总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。

示例2:

输入:nums = [-3,3,3,90]
输出:2
解释:元素 3 :严格较小元素是元素 -3 ,严格较大元素是元素 90 。
由于有两个元素的值为 3 ,总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。

提示

  • 1 <= nums.length <= 100
  • -10^5 <= nums[i] <= 10^5

⭐思路⭐

本题是一道比较简单的排序理解题,既要找到一个元素存在严格的较小元素又同时存在一个严格的较大元素

那我们可以将数组进行排序此时除却第一个元素与最后一个元素之间的每一个元素都存在了一个严格较小的数和一个严格较大的数。

唯一需要注意的就是:当我们搜索的元素只要与第一个和最后一个元素不相等时中间的每个元素都存在理论的严格较大元素和严格较小元素。

代码实现

class Solution {
    public int countElements(int[] nums) {
        int res = 0;
        //数组小于3则肯定不会存在一个严格较大和较小数最起码是三个数
        if (nums.length < 3)return 0;
        //进行快排
        Arrays.sort(nums);
        //遍历有多少个理论存在严格最大元素和严格最小元素
        for (int i = 1;i< nums.length-1;i++){
            if (nums[i] == nums[0] || nums[i] == nums[nums.length-1])continue;
            res++;
        }
        return res;
    }
}

执行结果

在这里插入图片描述

📑T2.[5991. 按符号重排数组]

题目

给你一个下标从 0 开始的整数数组 nums ,数组长度为 偶数 ,由数目相等的正整数和负整数组成。

你需要 重排 nums 中的元素,使修改后的数组满足下述条件:

任意 连续 的两个整数 符号相反
对于符号相同的所有整数,保留 它们在 nums 中的 顺序 。
重排后数组以正整数开头。
重排元素满足上述条件后,返回修改后的数组。

示例

示例1:

输入:nums = [3,1,-2,-5,2,-4]
输出:[3,-2,1,-5,2,-4]
解释:
nums 中的正整数是 [3,1,2] ,负整数是 [-2,-5,-4] 。
重排的唯一可行方案是 [3,-2,1,-5,2,-4],能满足所有条件。
像 [1,-2,2,-5,3,-4]、[3,1,2,-2,-5,-4]、[-2,3,-5,1,-4,2] 这样的其他方案是不正确的,因为不满足一个或者多个条件。 

示例2:

输入:nums = [-1,1]
输出:[1,-1]
解释:
1 是 nums 中唯一一个正整数,-1 是 nums 中唯一一个负整数。
所以 nums 重排为 [1,-1] 。

提示

2 <= nums.length <= 2 * 10^5
nums.length 是 偶数
1 <= |nums[i]| <= 10^5
nums 由 相等 数量的正整数和负整数组成

⭐思路⭐

简单的双指针问题,不过小付有点懒得优化代码了=-=

大体思路就是:

  • 构建两个辅助数组用于分别存放正数与负数,并且按照他们的顺序进行存储,利用双指针的特性来确立下标。
  • 然后依次进行遍历将结果添加到数组当中。

代码实现

class Solution {
    public int[] rearrangeArray(int[] nums) {
        int n = nums.length;
        //创建一个只存正数,与只存负数的数组
        int positiveArr[] = new int[n/2];
        int negativeArr[] = new int[n/2];
        //将元素注入到数组当中进行初始化
        for (int i = 0,j = 0,k = 0;i< nums.length;i++){
            if (nums[i] < 0){
                negativeArr[j] = nums[i];
                j++;
            }
            if (nums[i] > 0){
                positiveArr[k] = nums[i];
                k++;
            }
        }
        //记录结果
        int res[] = new int[n];
        boolean isPositive = true;
        //进行遍历
        for (int i = 0 ,j = 0,k = 0; i< nums.length;i++){
            //如果当前是该正数了就将值赋值到结果数组当中,反之将负数数组的结果赋值其中
            if (isPositive){
                res[i] = positiveArr[j];
                j++;
                isPositive = !isPositive;
            }else {
                res[i] = negativeArr[k];
                k++;
                isPositive = !isPositive;
            }
        }
        return res;
    }
}

执行结果

在这里插入图片描述

📑T3.[5990. 找出数组中的所有孤独数字]

题目

给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1 和 x - 1)出现在数组中,则认为数字 x 是 孤独数字 。

返回 nums 中的 所有 孤独数字。你可以按 任何顺序 返回答案。

示例

示例1:

输入:nums = [10,6,5,8]
输出:[10,8]
解释:
- 10 是一个孤独数字,因为它只出现一次,并且 9 和 11 没有在 nums 中出现。
- 8 是一个孤独数字,因为它只出现一次,并且 7 和 9 没有在 nums 中出现。
- 5 不是一个孤独数字,因为 6 出现在 nums 中,反之亦然。
因此,nums 中的孤独数字是 [10, 8] 。
注意,也可以返回 [8, 10] 。

示例2:

输入:nums = [1,3,5,3]
输出:[1,5]
解释:
- 1 是一个孤独数字,因为它只出现一次,并且 0 和 2 没有在 nums 中出现。
- 5 是一个孤独数字,因为它只出现一次,并且 4 和 6 没有在 nums 中出现。
- 3 不是一个孤独数字,因为它出现两次。
因此,nums 中的孤独数字是 [1, 5] 。
注意,也可以返回 [5, 1] 。

提示

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 106

⭐思路⭐

哎呀!遇到这种题就要考虑咱们的神 哈希表了塞~

大体思路如下:

  • 哈希表用来记录的是数组中每个元素值的个数

想到这下面这题就是个简单题了。

代码实现

class Solution {
    public List<Integer> findLonely(int[] nums) {
        List<Integer> ans = new LinkedList<>();
        HashMap<Integer, Integer> h = new HashMap<>();
        //对哈希表初始化 
        for (int x : nums) {
            h.putIfAbsent(x, 0);
            h.put(x, h.get(x) + 1);
        }
        //遍历哈希表
        for (int x : h.keySet())
            //如果当前元素的个数等于1并且不存在当前这个x-1与x+1的值时 就将结果加入。
            if (h.get(x) == 1 && !h.containsKey(x - 1) && !h.containsKey(x + 1))
                ans.add(x);
        return ans;
    }
}

执行结果

在这里插入图片描述

🙊写在最后🙊

小付打卡的第二场周赛 2022-01-23

因为最后一题 一般没时间做到那里 自知自身能力有限

尽可能把会做的题 都做好 就可以了

本次周赛 对了三道 困难题都先放一放

所以还是很不错的周赛体验

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值