首页 > 其他分享 >645.错误的集合

645.错误的集合

时间:2023-04-04 22:24:50浏览次数:43  
标签:数字 错误 nums int 重复 vector 645 集合

错误的集合

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

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

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

示例 1:

输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:

输入:nums = [1,1]
输出:[1,2]

提示:

\(2 <= nums.length <= 10^4\)
\(1 <= nums[i] <= 10^4\)

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/set-mismatch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路1:哈希表

这个没啥好说的。

code

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        int n = nums.size();

        vector<int> cnt(n + 1,0);

        for(auto item : nums) cnt[item] ++;

        vector<int> ans(2,0);

        for(int i = 1;i <= n;i ++)
        {
            if(cnt[i] == 0) ans[1] = i;
            if(cnt[i] == 2) ans[0] = i;

        }

        return ans;
    }
};

位运算

为了在常数空间内实现,需要使用位运算,实际上像是这种出现偶数次的通常可以考虑使用异或消除,但是本文中出现偶数次的是重复的数字,也是最后的结果,我们并不希望消除掉,怎么办呢?

  1. 在数组中添加1-n,这样重复的数字和缺失的数字都是奇数次,其余数字都是偶数次
  2. 全部异或就可以将其余数字全部去除
  3. 记x为重复的数字,y为缺失的数字,最后的结果为x ^ y
  4. 如何在2n个数字中找到x和y呢
  5. lowbit(x ^ y)为x和y的最低不同位,根据最低不同位区分x和y,将2n个数字都分到两个不同的组别中,同时每个组中可以通过异或消除重复的数字,找到x和y
  6. 最后判别x和y哪个是重复的哪个是缺失的

code

class Solution {
public:

    int lowbit(int x)
    {
        return x & (-x);
    }

    vector<int> findErrorNums(vector<int>& nums) {

        int n = nums.size();

        int xy = 0;

        for(auto item : nums) xy = xy ^ item;

        for(int i = 1;i <= n;i ++) xy = xy ^ i;

        int diff = lowbit(xy);

        int nums1 = 0,nums2 = 0;

        for(auto item : nums)
        {
            if((item & diff) == 0) nums1 ^= item;
            else nums2 ^= item;
        }

        for(int i = 1;i <= n;i ++)
        {
            if((i & diff) == 0) nums1 ^= i;
            else nums2 ^= i;
        }

        for(auto item : nums)
        {
            if(item == nums1) return {nums1,nums2};
        }

        return {nums2,nums1};


    }
};

标签:数字,错误,nums,int,重复,vector,645,集合
From: https://www.cnblogs.com/huangxk23/p/17288094.html

相关文章

  • 《基于Modern工具包的本地化方式》的错误修正
    在《基于Modern工具包的本地化方式》一文中实现的本地化方式忽略了在切换语言后,原始的文本值已经改变,要想再切换回去,由于找不到对应的本地化值,最终切换不了,因而,必须在第一次切换的时候记录下原始文本值,这样才能保证每次切换的时候都能找到对应值。在前文中还有一个bug是当本地化先......
  • 创建返回错误信息提示枚举值
    @Data@BuilderpublicclassErrorResult{privateStringerrCode;privateStringerrMessage;publicstaticErrorResulterror(){returnErrorResult.builder().errCode("999999").errMessage("系统异常稍后再试").build();}......
  • Redis——面试问题集合
    那你能说说Redis是单线程的?Redis完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度是O(1)。数据结构简单,对数据操作也简单。采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的CPU切换......
  • FWT & FMT & 集合幂级数 题解集
    CF449DJzzhuandNumbers简要题意给定序列\(\{a_n\}\),求有多少个子序列满足所有元素的按位与为\(0\)。题解F1考虑FWT的与卷积形式,构造序列\(\{A_n\}\),使\(A_i=\displaystyle\sum_{j\&i=i}a_i\),记\(B_i=\displaystyle\sum_{b\ina}[(b_1\&b_2\&\cdots\&b_n)\&......
  • 内核错误调试技巧记录
    printk打印调试include/linux/printk.h头文件externintconsole_printk[];#defineconsole_loglevel(console_printk[0])#definedefault_message_loglevel(console_printk[1])#defineminimum_console_loglevel(console_printk[2])#definedefault_console_loglevel......
  • JDK源码——集合类Iterator、 Collection类
    摘要主要是讲解这个集合的原理类相关的类。参看:https://zhuanlan.zhihu.com/p/165393520这个图由Map指向Collection的Produces并不是说Map是Collection的一个子类(子接口),这里的意思是指Map的KeySet获取到的一个视图是Collection的子接口。我们可以看到集合有两个基本接口:Map和Collec......
  • 练习——集合排序
    packagecom.collection_.list_;publicclassBook{privateStringname;privateStringauther;privatedoubleprice;publicBook(Stringname,Stringauther,doubleprice){this.name=name;this.auther=auther;......
  • C#异常没有错误行号的原因
    异常处理是编程中必知必会的重要内容,我们经常使用try-catch来捕获和记录异常信息的原因、位置信息,以便进行排查和解决问题。使用堆栈信息可明确抛出异常具体行号,但有时输出的却没有行号。如123System.DivideByZeroException:尝试除以零。在ExceptionTest.Form1.F......
  • COMP6451 Ethereum 编程
    UNSWCOMP6451Assignment2(version2)?EthereumProgramming(ERC-20TokenDutchAuctionMarket)TotalMarks:35DueDate:5pm,March31,2023(Distributiontothirdpartiesand/orplacementonnon-UNSWwebsitesprohibited.)BackgroundAvarietyofschemesareuse......
  • Linux c语言编程./a.out运行提示段错误
    段错误,几种可能:一、函数没有头文件(是的,有时候gcc不会提示没有头文件);二、函数重复定义,全局变量定义后、局部变量又定义了。(一般是调试的时候,代码改来改去,遗漏所致)三、Linux发行版系统差异,虽然都是Linux内核,同样的函数Ubuntu和CentOS需要的头文件就不一样,具体查看ma......