算法题每日一练---第58天:错误的集合

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、问题描述

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

题目链接:错误的集合

二、题目要求

样例

输入: nums = [1,2,2,4]
输出: [2,3]
复制代码

考察

1.哈希表(map)
2.建议用时10~25min
复制代码

三、问题分析

本题是位运算的第13题,没了解过位运算相关知识点可以看这一篇文章,讲解比较详细:

算法题每日一练---第45天:位运算

这一题,一开始我打算向位运算的异或靠拢的,将1~n下标数字与数组元素进行异或,那么最后只剩下一个缺失的下标、一个重复的数组元素。但后来发现不行,异或不能同时保留这两个数字。

14.png

我又试着搞一下map计数,因为重复数字的哈希值肯定为2,缺失数字的哈希值肯定为1,最后判断一下就行了。

除了这种,还可以排序之后彼此相邻的数字判断是否重复,也可以。

四、编码实现

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        vector<int>v;//数组存储
        int i,n=nums.size(),a,b;//初始化变量
        map<int,int>m;
        for(i=0;i<n;i++)//计数
        {
            m[nums[i]]++;
        }
        for(i=1;i<=n;i++)//判断数字
        {
            if(m[i]==2)//重复数字
                a=i;
            if(m[i]==0)//丢失数字
                b=i;
        }
        v.push_back(a);//插入数字
        v.push_back(b);//插入数字
        return v;//输出结果
    }
};

复制代码

五、测试结果

1.png

2.png

猜你喜欢

转载自juejin.im/post/7076598287104966670