【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
【Java实现】剑指Offer53.2——0~n-1中缺失的数字:面试真题,两种思路分享

前面有另一道面试题【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)
都是二分类型的,可以借鉴一下思路
题意解析:
这道题很特别,所有的测试用例都很有特点,都是形如[0,1,2,3,5,6,7]这样的,突然跳跃这个数值的索引,即是问题的解
具体如下:
- 前半部分数组中:索引和数值相等
- 后半部分数组中:索引比数值小1
第一种:二分思想
不同于以往的二分查找,这里二分法直接比较索引、数值这两者,来找到缺失的那个值,设索引为index,数值为nums[index]:
- 如果
nums[index] > index,则说明该index或其前方存在解(缺值) - 反之,说明解在该值的后方
因此,二分查找的步骤如下:
- 确定边界
i,j,获取mid索引 - 判断
mid索引和其对应数值的关系,并参照上述步骤进行循环 - 跳出循环后,
i所在的索引位置即为解
二分解法代码:
class Solution {
public int missingNumber(int[] nums) {
int i=0, j=nums.length-1;
while(i<=j) {
int mid=(i+j)>>1;
if(mid<nums[mid]) j=mid-1;
else i=mid+1;
}
return i;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
第二种:异或思想
异或运算中,同一个数异或的值为0:例如:5 ^ 5 = 0;a ^ b ^ b = a
根据题意,让数组元素与索引进行异或,如果相同,则结果为0相互抵消,最后与长度n-1异或。由于0~n-1共n个数,存在抵消不掉的情况,最后形成形式:a ^ b ^ a;结果就是缺少的那个数b
异或解法代码:
class Solution {
public int missingNumber(int[] nums) {
int len=nums.length;
int temp=0;
for(int i=0;i<len;i++) {
temp^=(i^nums[i]);
}
return len^temp;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
复杂度分析:
- 异或:时间O(n),空间O(1)
- 二分:时间O(logn),空间O(1)
异或方法虽然很快,但是其复杂度是高于二分法的,在数据量很大的时候推荐使用二分法。
原文章:https://blog.csdn.net/weixin_43191250/article/details/112153375
【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)的更多相关文章
- 【Java】 剑指offer(53-2) 0到n-1中缺失的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个 ...
- 分享13道上海尚学堂拿回来的Java面试真题,这些都是Java核心常见问题,想拿OFFER必看!
上海尚学堂Java培训学员参加面试带回来的真题,分享出来与大家,希望大家能认真地看看做一遍.后面有详细题解答案,对照下,看看自己做得怎么样,把这些面试遇到的真题全部掌握,做好面试笔试前的准备. 一.1 ...
- 剑指 Offer 53 - II. 0~n-1中缺失的数字 + 二分法
剑指 Offer 53 - II. 0-n-1中缺失的数字 Offer_53 题目详情 java代码 package com.walegarrett.offer; /** * @Author Wale ...
- 【剑指offer】53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0-n-1中缺失的数字 知识点:数组,二分查找: 题目描述 统计一个数字在排序数组中出现的次数. 示例 输入: nums = [5,7,7,8,8,10], tar ...
- [简单-剑指 Offer 53 - II. 0~n-1中缺失的数字]
[简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一 ...
- 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...
- 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案
2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...
- 【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...
- 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)
序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...
随机推荐
- android添加账户流程分析涉及漏洞修复
android修复了添加账户代码中的2处bug,retme取了很酷炫的名字launchAnyWhere.broadAnywhere(参考资料1.2).本文顺着前辈的思路学习bug的原理和利用思路. 我 ...
- UVA11520填充正方形
题意: 给你一个n*n的矩阵,让你往里面添加大写字母,矩阵有的字母已经给填好了,然后要求是每个格子都不能与他相邻的格子的大写字母相同,如果有多个答案,输出从上到下,从左到右所连接的成的那个n ...
- Windows PE 第十章 加载配置信息
加载配置信息 加载配置信息最初最用在Windows NT操作系统中,作为文件头部的延伸部分,后来被用作异常处理.加载配置信息表中存放了基于结构化异常处理(SEH)技术的各项异常句柄.当程序运行发生异常 ...
- 如何解决异步接口请求快慢不均导致的数据错误问题? - DevUI
DevUI 是一款面向企业中后台产品的开源前端解决方案,它倡导沉浸.灵活.至简的设计价值观,提倡设计者为真实的需求服务,为多数人的设计,拒绝哗众取宠.取悦眼球的设计.如果你正在开发 ToB 的工具类产 ...
- 每天一道面试题LeetCode 26--删除排序数组中的重复项(python实现)
题目1:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- phpstorm中加上符号($,括号等)后搜索不到
Ctrl+F右边选中这个Regex后带上符号就搜索不到,不要勾选这个就可以带符搜索了
- MySQL权限管理实战
前言: 不清楚各位同学对数据库用户权限管理是否了解,作为一名 DBA ,用户权限管理是绕不开的一项工作内容.特别是生产库,数据库用户权限更应该规范管理.本篇文章将会介绍下 MySQL 用户权限管理相关 ...
- mysql多线程备份与还原工具mydumper
(一)mydumper介绍 之前我们已经学过如何使用mysqldump备份恢复数据库:<mysql逻辑备份与还原工具mysqldump>,就目前来说,mysqldump是使用最广泛的MyS ...
- Davinci 可视化系统部署安装及简单使用
Davinci 是一个目前比较热门的国内开源BI系统,功能比较完善,各种可视化效果也挺不错.主要获取数据的方式是通过编写SQL 创建数据视图来展示各种图表的. Davinci面向业务人员/数据工程师/ ...
- python中类属性和数据属性的解释
python中的类叫class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实例 ...