前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang刷leetcode 技巧(20)0~n-1中缺失的数字

golang刷leetcode 技巧(20)0~n-1中缺失的数字

作者头像
golangLeetcode
发布2022-08-02 18:42:06
2730
发布2022-08-02 18:42:06
举报
文章被收录于专栏:golang算法架构leetcode技术php

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:

输入: [0,1,3]

输出: 2

示例 2:

输入: [0,1,2,3,4,5,6,7,9]

输出: 8

限制:

1 <= 数组长度 <= 10000

解题思路

解法1:二分

1,这是一个二分查找的变形

2,有个特殊点需要注意

3,如果 数组中,没有缺失的,那么缺失的在末尾

4,如果中间位置值和下标相等,则不用查找左边。

解法二:异或

^= 位逻辑异或赋值,是一个复合赋值运算符

异或就是两个数的二进制形式,按位对比,相同则取0。

0^0→0 , 0^1→1 , 1^0→1 , 1^1→0

任何数与0异或等于它本身,即a^0=a

一个数与自己异或结果为0,即a^a=0

令0~n的数与nums中的数异或,运算中除了缺失值只出现一次外,其他数都出现两次等同于与自身异或。

源码实现

代码语言:javascript
复制
func missingNumber(nums []int) int {
l:=len(nums)-1
if nums[l]==l{
    return l+1
}
 return missing(nums,0,len(nums)-1)
 
}

func missing(nums []int,l,r int)int{
 if l==r{
     return l
 }
 m:=(l+r)/2
 
 if nums[m]==m{
     return missing(nums,m+1,r)
 }
 return missing(nums,l,m)
}
代码语言:javascript
复制
func missingNumber(nums []int) int {
l:=len(nums)-1
for i,v:=range nums{
    if i^v!=0{
        return i
    }
}
return l+1
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档