【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 = 0a ^ b ^ b = a

根据题意,让数组元素与索引进行异或,如果相同,则结果为0相互抵消,最后与长度n-1异或。由于0~n-1n个数,存在抵消不掉的情况,最后形成形式: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

复杂度分析:

  1. 异或:时间O(n),空间O(1)
  2. 二分:时间O(logn),空间O(1)

异或方法虽然很快,但是其复杂度是高于二分法的,在数据量很大的时候推荐使用二分法。

原文章:https://blog.csdn.net/weixin_43191250/article/details/112153375

【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)的更多相关文章

  1. 【Java】 剑指offer(53-2) 0到n-1中缺失的数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个 ...

  2. 分享13道上海尚学堂拿回来的Java面试真题,这些都是Java核心常见问题,想拿OFFER必看!

    上海尚学堂Java培训学员参加面试带回来的真题,分享出来与大家,希望大家能认真地看看做一遍.后面有详细题解答案,对照下,看看自己做得怎么样,把这些面试遇到的真题全部掌握,做好面试笔试前的准备. 一.1 ...

  3. 剑指 Offer 53 - II. 0~n-1中缺失的数字 + 二分法

    剑指 Offer 53 - II. 0-n-1中缺失的数字 Offer_53 题目详情 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  4. 【剑指offer】53 - II. 0~n-1中缺失的数字

    剑指 Offer 53 - II. 0-n-1中缺失的数字 知识点:数组,二分查找: 题目描述 统计一个数字在排序数组中出现的次数. 示例 输入: nums = [5,7,7,8,8,10], tar ...

  5. [简单-剑指 Offer 53 - II. 0~n-1中缺失的数字]

    [简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一 ...

  6. 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字

    题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...

  7. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

  8. 【Java】 剑指offer(1) 找出数组中重复的数字

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...

  9. 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)

    序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...

随机推荐

  1. node-redis基本操作

    //npm install redis var redis = require("redis"), client = redis.createClient(); client.se ...

  2. Docker简单流程

  3. 基于linux信号的timeout装饰器

    在做基于ray的分布式任务处理时,偶尔遇到由于ray集群不稳定导致的长时间连接不上,进而导致程序卡死,无法向后端返回任务状态的情况.但是ray的初始化函数本身未实现超时机制,因此设计基于多线程+信号的 ...

  4. IOS小组件(6):小组件实现时钟按秒刷新

    引言   上一节中我们了解了IOS小组件的刷新机制,发现根本没法实现按秒刷新,但是看别的App里面有做到,以为用了什么黑科技,原来是因为系统提供了一个额外的机制实现时间的动态更新,不用走小组件的刷新机 ...

  5. Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析

    1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...

  6. Windows进程间通讯(IPC)----消息队列

    消息队列 windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息.这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建 ...

  7. easy-flows源码研习

    一.项目概述 1.原项目github地址:https://github.com/j-easy/easy-flows.git 2.easy-flows可以用非常简易的api创建常用的可组合的工作流.涵盖 ...

  8. Codeforces Round #688 (Div. 2)

    A. Cancel the Trains 题意:给定两个数组,找出这两个数组中有多少重复元素,然后输出 思路:直接找 代码: 1 #include<iostream> 2 #include ...

  9. 建站第二步:简单配置Nginx反代理工具

    简单配置Nginx反代理工具 你要用你的域名能和服务器绑定就要用一些反代理工具 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,极其优异的服务器软件,底层为C 来自某些 ...

  10. [bug] MapReduce卡死

    参考 https://blog.csdn.net/WYpersist/article/details/80202055