java数据结构与算法刷题-----LeetCode645. 错误的集合(位运算解法需要重点掌握)

Java刷题大全(笔试题)【大厂必备】(基础) Java全网最全刷题大全 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

法一:桶排序思想

解题思路
  1. 题目说,每个集合的值都是1 ~ n,一般我们会想到将数组中元素,挨个作为key放入map中,然后遍历1~n从map中获取value,看看谁是0,谁是2.
  2. 但是我们可以直接再创建一个数组,长度为n+1,用下标来代表数字,将1~n的个数,放入桶中。比如遍历nums数组是,当前元素是1,就放入下标为1的桶中,此时这个桶有1个元素,当我们有遍历到1时,再次放入下标为1的桶,此时这个桶有2个元素。
    在这里插入图片描述
代码:时间复杂度O(n) 空间复杂度O(n)

在这里插入图片描述

class Solution {
    public int[] findErrorNums(int[] nums) {
        int[] ans = new int[2];//答案要求返回形式
        int[] bucket = new int[nums.length + 1];//桶排序的思想,因为nums中的值固定为1~n
        for (int num : nums) bucket[num]++;//将数组中的值,放入对应的桶
        for (int i = 1; i <= nums.length; i++) {//依次遍历1~n
            if (bucket[i] == 0) ans[1] = i;//如果当前桶中元素个数为0,说明集合缺少这个元素
            else if (bucket[i] == 2) ans[0] = i;//如果当前桶有2个元素,说明集合中这个值有重复
            if (ans[0] != 0 && ans[1] != 0) break;//如果已经找到答案,就无需继续遍历了
        }
        return ans;//返回答案
    }
}

法二:位运算

题目细节
  1. 每个集合包含的元素必然为1 ~ n。例如n = 4,那么集合可以是[1,2,3,4],[1,2,4,3],[4,3,2,1]等等,但是必然包含1,2,3,4,也就是1~n这n个数。
  2. 但是题目说了,每个集合都发生了错误,有一个数字重复,而另一个数字消失了,比如[1,2,2,4], 正确的应该是包含1,2,3,4这4个数,但是现在少了一个3.

请在下面文章中,了解一下异或和补码的

位运算https://blog.youkuaiyun.com/grd_java/article/details/136119268
这道题,需要你知道关于补码的什么呢?
  1. 集合中保存的都是1~n的正数,计算机保存也都是补码,也就是符号位为0表示正数
  2. 正数的补码和源码是一样的,例如1 = 0,000 0000 0000 0000 0000 0000 0000 0001 (以32位进行保存)
  3. 负数的补码和源码的区别是,符号位和最右边的1不变,这两个不变的二进制位中间的其余数值位全部取反
  1. 原码:例如-1= 1,000 0000 0000 0000 0000 0000 0000 0001
  2. 补码:例如-1= 1,111 1111 1111 1111 1111 1111 1111 1111
  1. 我们现在有了1和-1的补码。
  1. 1 = 0,000 0000 0000 0000 0000 0000 0000 0001
  2. -1= 1,111 1111 1111 1111 1111 1111 1111 1111
  3. 我们发现,除了最右边的1以外,这个1左边所有的数,都是不同的。
  1. 如果此时我执行1与-1 也就是 1 & (-1)

我会得到0,000 0000 0000 0000 0000 0000 0000 0001,也就是除了最右边的1以外,其余全是0. 这样我就得到了这个数的最低位的那个1.也就是我得到了这个数,最右边的一个二进制1的位置。并且其余二进制位全是0

  1. 得到它有什么用呢?作用就是简化判断条件,让我们只需要用if考虑两种情况,而不是无数种。
  1. 0 & 任何数都是0,只有1 & 1 才能唯一的 = 1. 这就是它的作用。对于最终得到的只有最右1,其余全为0的二进制串lowbit = 0,000 0000 0000 0000 0000 0000 0000 0001来说,只有遇到一个同样1在最右边的数才会不为0,否则它必然为0.
  2. 它让任何数与其相与只有两种结果,要么为1,要么为0.而不是各种值。
  1. 例如 8 = 0,000 0000 0000 0000 0000 0000 0000 1000
  2. 和lowbit相与0,000 0000 0000 0000 0000 0000 0000 0001
  3. 结果为==0,000 0000 0000 0000 0000 0000 0000 0000
  1. 如果不进行只取最右边1的操作,直接随便两个数呢?

8的二进制补码为:0000 … 1000
9的二进制补码为:0000 … 1001
异或结果为:==== 0000 … 1000 这个值=8,不同的数,还有无穷多种结果
请你告诉我,我该如何写if语句,描述这大量的结果呢?我们当然希望只有0或者1两种状态,以方便我们写if语句。所以这就是只保留最右边的1,其余全部为0的作用。

解题思路

在这里插入图片描述

  1. 案例的补码
  1. 1的补码:0,000 0000 0000 0000 0000 0000 0000 0001
  2. 2的补码:0,000 0000 0000 0000 0000 0000 0000 0010
  3. 3的补码:0,000 0000 0000 0000 0000 0000 0000 0011
  4. 4的补码:0,000 0000 0000 0000 0000 0000 0000 0100
  1. 找到,缺少的数和重复的数的异或结果,记为xor。
  1. 整体异或消除重复的元素:1⊕2⊕2⊕4 = 1⊕0⊕4 = 1⊕4. 这里利用了异或的结合律和异或规律(相同的数异或 = 0)
  2. 和1~n异或获得重复的数和缺少的数的异或。1⊕4⊕1⊕2⊕3⊕4 = (1⊕1)⊕(4⊕4)⊕(2⊕3) = 2⊕3此时就是重复的数2,和缺少的数3的异或结果。记为xor
  1. 找到xor这个异或结果的最低位1. 上面说过,这个操作就是将if判断简化为只需要判断是0还是1,而不是无穷多种.

xor & (-xor) = 只保留最低位的1,其余全为0. 记为lowbit = 0,000 0000 0000 0000 0000 0000 0000 0001。这里很巧,这个例子的lowbit正好是1的补码。

  1. 这道题需要两个结果,一个是缺少的数,另一个是重复的数

我们这里常用的套路就是分成两组计算。因为我们上面分析过,任何数和lowbit相与,只有0和1两种结果。我们将与lowbit相与为0分为一组,让它和num1进行异或。与lowbit相与为1的分为另一组,让它和num2进行异或。

  1. nums数组中的值[1,2,2,4],依次和lowbit进行分组异或. 可以获得两个没有任何问题的数。也就是既不是丢失的,也不是重复的。
  1. 1&lowbit = 1, num2 ^=1 = 0⊕1=1. 首先是1这个数,与lowbit相与,发现值为1,将其分为1组,和num2进行异或
  2. 2&lowbit = 0, num1 ^=2 = 0⊕2=2. 然后2这个数,与lowbit相与,发现值为0,分到0组,和num1异或
  3. 2&lowbit = 0, num1 ^=2 = 2⊕2 = 0. 然后又是2这个数,与lowbit相与,发现值为0,0组异或
  4. 4&lowbit = 0, num1 ^=4 = 0⊕4 = 4. 最后是4这个数,与lowbit相与,发现值为0,0组异或
  5. 最终,num1 = 4,num2 = 1
  1. 然后和1~n,也就是1,2,3,4进行再次分组异或,找到两个有问题的数。也就是重复的,和丢失的
  1. 1&lowbit = 1, num2 ^=1 = 1⊕1 = 0.
  2. 2&lowbit = 0, num1 ^=2 = 4⊕2 = 6. 这个6是二进制转换过来的,大家可以自己用代码算
  3. 3&lowbit = 1, num2 ^=3 = 0⊕3 = 3.
  4. 4&lowbit = 0, num1 ^=4 = 6⊕4 = 2.
  5. 最终,num1 = 2,num2 = 3。但是到底谁是丢失的,谁是重复的,我们也不知道
  1. 再次进行nums数组[1,2,2,4]的遍历比对,看看num1是否保存的是重复的值,如果是,num1作为重复值,num2作为缺失值返回。否则num1作为缺失值,num2作为重复值返回
代码:时间复杂度O(n) 空间复杂度O(1)

在这里插入图片描述

class Solution {
    public int[] findErrorNums(int[] nums) {
        //异或 两个数相同异或为0,两个数不同异或为1
        //任何数a异或0,都等于a本身。0 ⊕ a = a 
        //两个相同的数异或必然为0。a ⊕ a = 0;
        //最关键的是,异或具有结合律。0⊕1⊕2⊕2 = (0⊕1)⊕(2⊕2) = 1 ⊕ 0 = 1; 
        int n = nums.length;
        int xor = 0;
        //整体异或消除重复的元素:1⊕2⊕2⊕4 = 1⊕0⊕4 = 1⊕4. 这里利用了异或的结合律和异或规律(相同的数异或 = 0)
        for(int num:nums) xor ^= num;
        //和1~n异或获得重复的数和缺少的数的异或。1⊕4⊕1⊕2⊕3⊕4 = (1⊕1)⊕(4⊕4)⊕(2⊕3) = 2⊕3此时就是重复的数2,和缺少的数3的异或结果。记为xor
        for(int i = 1;i<=n;i++) xor^=i;
        //xor & (-xor) = 只保留最低位的1,其余全为0. 记为lowbit = `0`,000 0000 0000 0000 0000 0000 0000 0001。这里很巧,这个例子的lowbit正好是1的补码。
        int lowbit = xor & (-xor);
        //用两个变量,分别记录这道题答案需要的两个值
        int num1 = 0, num2 = 0;//初始为0
        //我们这里常用的套路就是分成两组计算。因为我们上面分析过,任何数和lowbit相与,只有0和1两种结果
        for(int num:nums){
        		//nums数组中的值[1,2,2,4],依次和lowbit进行分组异或. 可以获得两个没有任何问题的数。也就是既不是丢失的,也不是重复的。
            if((num & lowbit)==0) num1^=num;
            else num2 ^= num;
        }
        //然后和1~n,也就是1,2,3,4进行再次分组异或,找到两个有问题的数。也就是重复的,和丢失的
        for(int i = 1;i<=n;i++){
            if((i & lowbit)==0) num1^=i;
            else num2^=i;
        }
        //再次进行nums数组[1,2,2,4]的遍历比对,看看num1是否保存的是重复的值,如果是,num1作为重复值,num2作为缺失值返回。
        for(int num:nums){
            if(num==num1) return new int[]{num1,num2};
        }
        //否则num1作为缺失值,num2作为重复值返回
        return new int[]{num2,num1};
    }
}
蓝桥杯Java国赛A组:工程级Java能力实战指南 Java编程能力不仅限于语法与算法,更体现在对JVM内存模型、并发控制机制、协议解析逻辑及硬件协同建模的系统性理解。从OutOfMemoryError的物理成因到虚拟线程的适用边界,从SG函数驱动的博弈建模到基于状态机的645协议解析,本质是将现实系统抽象为高内聚、低耦合、可验证的代码结构。这些能力直接决定在资源受限(如-Xmx128m)、高实时性(如按键消抖)、强一致性(如分布式锁)等典型工业场景下的交付质量。本文聚焦蓝桥杯Java A组国赛真题所暴露的核心工程断层,覆盖内存优化、并发设计、协议解析与状态 阅读详情

相关推荐

保姆级教程:用Kalibr搞定Intel D435i三目(RGB+双目)相机联合标定,附完整ROSbag录制避坑指南

本文详细介绍了如何使用Kalibr工具对Intel D435i三目相机(RGB+双目)进行高精度联合标定,包括硬件准备、ROSbag录制技巧、Kalibr标定实战及结果验证。特别针对实际工程中的常见问题提供了解决方案,帮助开发者提升SLAM和三维重建等应用的精度。

weixin_42524762的博客 405

牛客网——Java刷题篇

牛客-找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决

chenchenchencl的博客 1万+

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4590

【刷题记录⑨】Java工程师丨字节面试真题(三)

我几乎每天都会刷题训练来使自己对各种算法随时保持一个清晰的状态。要知道眼过千遍不如手过一遍,想成为一名合格的开发工程师,更要逼迫自己养成动手的好习惯。

陈橘又青的博客 5930

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

本文深入解析Kasada最新版x-kpsdk-cd环境检测机制,提供动态请求拦截、本地替换和函数插桩等实战调试策略。通过Proxy保护破解、关键函数断点调试和环境检测对抗方案,帮助逆向工程师有效应对从280位扩展到294位的加密数组挑战,实现高效补环境调试。

weixin_29251567的博客 572

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2087

卧槽!这几个 Java 网站,有点刺激!

看到这个界面就爱了,里面包括大量的算法题,这些算法题是大厂面试必出的题型,据说掌握了这些算法题后,你可以吊打中国任何一家大厂,是不是真的咱也不知道,毕竟咱们没做过几道题。干净清爽,基本上所有的问题你在 StackOverflow 都能找到答案,你可以提出公共问题,也可以提出私人问题,甚至可以在 StackOverflow 上找工作。包含各种内容,总揽,编程语言,工具,特性,JVM 等,只不过语言有一些生硬,需要强大的英文功底,不过现在有谷歌翻译后我觉得这些问题也都不是问题了。现在重新好好复习手上的。

ssdrrg的博客 2920

Stata中介效应分析实战:从sgmediation安装到Sobel检验结果解读

本文提供了Stata中进行中介效应分析的完整实战指南,重点介绍了第三方命令sgmediation的安装、配置与使用。通过详细案例演示了如何运用Sobel检验分析变量间的间接效应,并深入解读检验结果,帮助研究者厘清自变量影响因变量的具体路径。文章还探讨了Sobel检验的原理、优缺点及结果报告规范,是进行实证研究的实用参考。

weixin_29197051的博客 631

力扣刷题必备(java版)

判断为空采用是stack.isEmpty();Queue和Deque的方法相同,故可忽略stack和queue的区别,统一记后一种方法。

weixin_51951103的博客 1937

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 221

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5191

[LeetCode]645. 错误的集合(java实现)

[LeetCode]645. 错误的集合(java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路: 确认重复的数 确认丢失的数(重复的数有可能不是放在一起的) 目前能想到的确认重复的数有两种方法: hashmap new一个新数组存放出现的次数 此处使用数组更简单:用数组存放好出现的次数后,会有一个值为2,一个值为0,为2的是重复数,为0的是丢失数 3. 解法 ---

cloud的博客 373

YOLO系列算法改进 | C3k2改进篇 | 融合DFRL双融合注意力接收层 | 轻量化与全局感受野双突破,适应高分辨率航拍与密集小目标检测场景 | CVPR 2026

YOLO系列算法改进 | C3k2改进篇 | 融合DFRL双融合注意力接收层 | 轻量化与全局感受野双突破,适应高分辨率航拍与密集小目标检测场景 | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用C3k2_DFRL创新模块进行改进)

2502_91881744的博客 233

java项目-刷题项目实现细节及思路

由于是使用druid数据库,连接池可以使用阿里巴巴的加密 在infra下的basic⬇️创建一个utils 再创建一个druidencryptutil在其中声明,加密的公钥和解密的工钥创建两个方法,加密方法和解密方法,最后将数据库的密码用加密方法输出。在刷题controller中先在P O M文件中声明spring boot的启动依赖因为他们是单独的模块,所有的启动要在start里面,所以要将controller放到start的pom文件中去扫描。xml文件中也有 并且都相对应。

m0_73476251的博客 2110

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java新手靠谱学习平台和刷题平台推荐

在Java开发日渐饱和的情况下,不断的深入学习才能使自己立于不败之地,能打败自己的只有自己。加油干了兄弟们

weixin_45927153的博客 4292

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java——经典基础题【刷题1】

Java——经典基础题【刷题1】

m0_64387122的博客 639

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JAVA 算法

又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。

渔阳的博客 1684

2023最新高级java面试题,包含答案。刷题必备!记录一下。

Java注解(Annotation)是JDK 5.0引入的一种元数据,用于将某些信息与代码关联起来。这些信息并不直接影响代码的执行,但可以被其他工具或库利用。注解提供了一种安全的、反射的方式,来为我们的代码添加额外的元数据信息。这些信息可以在编译时被编译器利用,也可以在运行时被JVM或其他利用注解的工具利用。Java注解的主要用途包括编译检查:注解可以用于编译时检查,例如@Override注解。当你用@Override标注一个方法时,编译器会检查该方法是否覆盖了父类中的方法。配置。

m0_62946064的博客 3628

算法刷题Java技巧

算法刷题技巧

范大的博客 1016

面试刷题java

利用一个队列存储每一层的元素,最开始的时候先将根节点放入队列中,然后进行循环,循环的条件就是队列不为空,先获取队列地长度,然后逐个将队列头部地元素弹出,并且将弹出地结点地儿子结点放入栈中,等到一层遍历结束,队列中地元素都是子节点地元素,也就是下一层地原素,这样就实现了树地层次遍历了。java.lang包是java语言的核心包,lang是language的缩写 java.lang包定义了一些基本的类型,包括Integer,String之类的,是java程序必备的包,有解释器自动引入,无需手动导入。

qq_52485934的博客 395

java基础

1.标识符的命名规则有哪些? 不遵守,编译不通过。 标识符的命名规范有哪些?不遵守,编译运行都可以通过 包名:xxxyyyzzz 类名、接口名:XxxYyyZzz 变量名、方法名:xxxYyyZzz 常量名:XXX_YYY_ZZZ Java变量按照数据类型怎么划分?并指出Java的基本数据类型有哪8种,并指出各自占用的内存空间大小 byte short int long char float double boolean 引用数据类型:类、接口、数组 说明基本数据类型变量之间自动类型提升的运算规则。 by

qq_45608338的博客 411

Java刷题总结(面试)

java 中String是 immutable的,也就是不可变,一旦初始化,其引用指向的内容是不可变的。也就是说,String str = “aa”;str=“bb”;第二句不是改变“aa”所存储地址的内容,而是另外开辟了一个空间用来存储“bb”;同时由str指向 原来的“aa”,现在已经不可达,GC时会自动回收。 因此String作为参数传进来时候,str= "test ok"; 实际给副本引用str指向了新分配的地址,该地址存储“test ok”。 因此,原先的str仍然指向“good”String类由

李青水的博客 1414

Java---刷题01

java刷题

weixin_51912875的博客 627

真心推荐8个高质量Java学习网站,一起从入门到精通java语言,大厂java面试真题分享,建议码住!...

Java自学超全干货分享!学不学自己看着办吧!最近收到了很多知友私信我:”0基础有什么推荐的Java学习工具?”★作为ACM金牌选手,这些年在跟很多学员受教的过程中,积累了一些关于新手Java学习的经验和踩过的坑,今天来跟大家分享几点:1.找准学习路径和方法(选择不对,努力白费)2.合理规划学习时间,不在没必要的技术上浪费时间(找重点)3.找一些志同道合的朋友一起学习(相互鞭策)4.找一个前辈指点...

九章算法的博客 2万+

java数据结构与算法刷题-----LeetCode75. 颜色分类

【代码】java数据结构与算法刷题-----LeetCode75. 颜色分类。

殷志鹏的博客 1158

Java算法刷题

如需从小到大,直接把>=换成小于等于就行。

m0_48038376的博客 373
上一篇: java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素
下一篇: java数据结构与算法刷题-----LeetCode287. 寻找重复数
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

ydenergy_殷志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值