[路飞]_leetcode第277场周赛总结(上)

214 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

前言

上午参加leetcode第277场周赛,这个竞赛是全网公开的,一般我有空都会参加一下。证明一下自己有多菜。本次竞赛不出意外,千名开外。屡战屡败。。。。

题目一:5989. 元素计数

题目正文

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

示例

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

题解

这要求很简单呀,找到数组最大值,最小值,枚举数组,小于最大值且大于最小值的数据放入结果数组中。 返回结果数组即可,竞赛第一题还是比较简单的。

时间复杂度:枚举一边得到最大值最小值,再枚举一边得到结果,复杂度为O(n)

代码

var countElements = function(nums) {
    const min = Math.min(...nums)
    const max = Math.max(...nums)
    let result = 0;
    for(let i = 0 ; i < nums.length ; i++){
        if(nums[i] !== min &&  nums[i] !== max) result++;
    }
    return result
};

题目二 5991. 按符号重排数组

题目正文

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

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

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

示例

输入: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] 这样的其他方案是不正确的,因为不满足一个或者多个条件。

题解

借用数组

  • 枚举数组将大于0的元素放入数组z中,将小于0的元素放在数组f中
  • 将数组z、f元素依次放入结果函数中
  • 返回结果函数

代码

var rearrangeArray = function(nums) {
    const f = [];
    const z = [];
    for(let i = 0 ; i < nums.length ; i++){
        if(nums[i] > 0){
            z.push(nums[i])
        }else{
            f.push(nums[i])
        }
    }
    const result = []
    let k = 0;
    while( k  < z.length){
        const t1 = z[k]
        result.push(t1);
        const t2 = f[k]
        result.push(t2);
        k++;
        
        
    }
    return result

};

双指针

数组位置是固定的,正整数在偶数位,负整数在奇数位,直接使用指针将元素放到指定位置;

  • 枚举数组,定义指针j,k
  • 如果数组元素大于0,将元素放在j位置上,j+=2
  • 如果数组元素小于0,将元素放在k位置上,k+=2
  • 依次枚举即可得到答案

代码

var rearrangeArray = function(nums) {
    const len = nums.length;
    let i = 0 ; 
    let j = 0;
    let k = 1;
    const result = []
    while( i < len){
        if(nums[i] > 0){
            result[j] = nums[i];
            j+=2
        }else{
            result[k] = nums[i];
            k+=2
        }
        i++
    }
    return result
};

题目三 5990. 找出数组中的所有孤独数字

题目正文

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

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

示例

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

题解

  • 一次枚举,将数组元素出现的次数存放到哈希map中
  • 再次枚举数组,对任意数组元素k;如果k-1,k+1都不在map中,并且map[k] === 1;当前元素k是孤独数字
  • 将孤独数字数字存放到结果数组中
  • 返回结果数组

代码

var findLonely = function(nums) {
    const map = {};
    for(let i = 0 ; i < nums.length ; i++){
        const k = nums[i]
        map[k] = (map[k] || 0) +  1;
    }
    const result = []
    for(let i = 0 ; i < nums.length ; i++){
        const k = nums[i] 
        const k1 = nums[i] + 1;
         const k2 = nums[i] - 1;
        if(!map[k1] && !map[k2] && map[k] === 1){
            result.push(k)
        }
    }
    return result

};

结语

花了13分钟敲代码,解决了上述3题,我还觉得是不是今天要4题全都AC了,日常情况我是看不到第4题的,因为第3题基本上就要花费一个小时解决,看第4题的时候已经超时了。现在我还有一个小时取解决第4题呢。然后我就不知深浅的打开了第4题的题目。哎~菜的题目差点都读不懂;所以第4题竞赛我挂了,赛后看的大神题解才理解的。