Go语言题解LeetCode268丢失的数字示例详解

目录
  • 题目描述
    • 思路分析
    • AC 代码
  • 异或两遍 - 丢失的数字
    • 解题思路
    • 代码
  • C++ 排序二分、加减法、异或 - 丢失的数字
    • 解题思路:

题目描述

原题链接 :

268. 丢失的数字

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4:

输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

提示:

n == nums.length

1 <= n <= 10^4

0 <= nums[i] <= n

nums 中的所有数字都 独一无二

进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

思路分析

拿到这个题目,发现其是在[0,n]范围内给出n个数字,也就是说,这个是高度适配将数组进行排序的想法的。 对于完整的数组,其排序后应该是一个跟下标值完全一致的数组集合。 那么解法就很简单了,寻找第一个跟元素不匹配的下标,其就是缺失的数字;

AC 代码

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        nums.sort()
        for i in range(len(nums)):
            if nums[i] != i:
                return i
        return len(nums)

异或两遍 - 丢失的数字

解题思路

异或是一个可交换顺序的操作。同一个数字异或两遍等于零。

所以我们先求出数据的范围,直接找最大的数即可。 这里需要注意,如果最大的数字小于数组长度,则缺失的数字是最大的数字+1。

然后我们对 [0, n] 的所有数字累计异或一边,再对数组中的所有元素也异或一遍,最后就只剩下唯一一个没有出现的数字了。因为其他数字都出现了两遍。

代码

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = 0;
        int ans = 0;
        for (auto num: nums) {
            n = max(n, num);
            ans ^= num;
        }
        if (nums.size() > n) n = nums.size();
        for (int i = 0; i <= n; i++) {
            ans ^= i;
        }
        return ans;
    }
};

C++ 排序二分、加减法、异或 - 丢失的数字

解题思路:

看到该题第一个想法就是二分法,首先给数字排序,然后通过mid值判断在左边还是在右边,nums[mid] == mid说明在右边,否则在左边,但是最后还要注意缺失的是最后一个数的情况,那么我们就要根据最后一个数进行判断,再进行返回,代码如下:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int left = 0, right = nums.size() - 1;
        while(left < right) {
            int mid = (left + right) / 2;
            if(nums[mid] == mid) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return (right == nums.size() - 1 && nums[right] == right) ? right + 1 : right;
    }
};

但是显然没必要那么复杂,时间效率低,最全局的想法就是把所有下标加起来并且把数组都减去,剩下的就是丢失的数字,代码如下:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int total = 0;
        int i;
        for(i = 0; i < nums.size(); i ++) {
            total += i;
            total -= nums[i];
        }
        total += i;
        return total;
    }
};

异或的方法其实和加减方法实现方式一样,只是底层原理不同罢了,思路都是抵消掉相同的,留下唯一一个单独的,代码如下:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int total = 0;
        int i;
        for(i = 0; i < nums.size(); i ++) {
            total ^= i;
            total ^= nums[i];
        }
        total ^= i;
        return total;
    }
};

以上就是Go语言题解LeetCode268丢失的数字示例详解的详细内容,更多关于go题解丢失数字示例的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言题解LeetCode1128等价多米诺骨牌对的数量

    目录 题目描述 思路分析 AC 代码 偷懒解法 思路: 图解: 代码: 哈希表+元素转换 解题思路 代码 复杂度分析 题目描述 1128. 等价多米诺骨牌对的数量 - 力扣(LeetCode) 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 

  • Go语言题解LeetCode455分发饼干示例详解

    目录 题目描述 思路分析 AC 代码 分发饼干 贪心算法 解题思路 代码 题目描述 原题链接 : 455. 分发饼干 - 力扣(LeetCode) (leetcode-cn.com) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干. 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j,都有一个尺寸 s[j] .如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足.你的目标

  • go语言题解LeetCode506相对名次示例详解

    目录 一 描述 二 分析 三 答案 一 描述 506. 相对名次 给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分.所有得分都 互不相同 . 运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推.运动员的名次决定了他们的获奖情况: 名次第 1 的运动员获金牌 "Gold Medal" . 名次第 2 的运动员获银牌 "Silver Medal" . 名次第

  • go语言题解LeetCode1160拼写单词示例详解

    目录 题目描述 思路分析 AC 代码 别人用int[26] 解题思路 代码 c++几乎双百的哈希解法 代码 题目描述 1160. 拼写单词 - 力扣(LeetCode) 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词. 注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次. 返回词汇表 words 中你

  • Go语言题解LeetCode561数组拆分

    目录 一 描述 二 分析 三 答案 Python 语言 - 数组拆分 解题思路 代码一 代码二 代码三 一 描述 561. 数组拆分 I - 力扣(LeetCode) (leetcode-cn.com) 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大. 返回该 最大总和 . 示例 1: 输入:nums = [1,4,3,2] 输出:4

  • Go语言题解LeetCode268丢失的数字示例详解

    目录 题目描述 思路分析 AC 代码 异或两遍 - 丢失的数字 解题思路 代码 C++ 排序二分.加减法.异或 - 丢失的数字 解题思路: 题目描述 原题链接 : 268. 丢失的数字 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数. 示例 1: 输入:nums = [3,0,1] 输出:2 解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内.2 是丢失的数字,因为它没有出现在 nums 中. 示例 2

  • Go语言题解LeetCode888公平糖果交换示例详解

    目录 一 描述 二 分析 三 答案 一 描述 888. 公平的糖果交换 - 力扣(LeetCode) (leetcode-cn.com) 爱丽丝和鲍勃拥有不同总数量的糖果.给你两个数组 aliceSizes 和 bobSizes ,aliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量. 两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果.一个人拥有的糖果总数量是他们每盒糖果数量的总和. 返回一个

  • go语言编程之select信道处理示例详解

    目录 select信道处理 fibonacci数列监听 select监听协程 select信道处理 注意:有default就不会阻塞 package main func main() { var chan1 = make(chan int) var chan2 = make(chan int) select { case <-chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2: // 如果chan2成功读到数据,则进行该case处理语句 default

  • Go语言中循环语句使用的示例详解

    目录 一.概述 1. 循环控制语句 2. 无限循环 二.Go 语言 for 循环 1. 语法 2. for语句执行过程 3. 示例 4. For-each range 循环 三.循环嵌套 1. 语法 2. 示例 四.break 语句 1. 语法 2. 示例 五. continue 语句 1. 语法 2. 示例 六.goto 语句 1. 语法 2. 示例 一.概述 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句. 循环程序的流程图: Go 语言提供了以下几种类型循环

  • R语言UpSet包实现集合可视化示例详解

    目录 前言 一.R包及数据 二.upset()函数 1)基本参数 2)queries参数 3)attribute.plots参数 3.1 添加柱形图和散点图 3.2 添加箱线图 3.3 添加密度曲线图 前言 介绍一个R包UpSetR,专门用来集合可视化,当多集合的韦恩图不容易看的时候,就是它大展身手的时候了. 一.R包及数据 #安装及加载R包 #install.packages("UpSetR") library(UpSetR) #载入数据集 data <- read.csv(&

  • Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号("")或反引号(``)定义. 双引号:"", 用于单行字符串. 反引号:``,用于定义多行字符串,内部会原样解析. 示例: // 单行 "心有猛虎,细嗅蔷薇" // 多行 ` 大风歌 大风起兮云飞扬. 威加海内兮归故乡. 安得猛士兮守四方! ` 字符串支持转义

  • Go语言基础设计模式之策略模式示例详解

    目录 概述 针对同一类型问题的多种处理方式 一.不使用策略模式 二.策略模式 UML 总结 示例 概述 定义一系列算法,将每个算法封装起来.并让它们能够相互替换.策略模式让算法独立于使用它的客户而变化. 针对同一类型问题的多种处理方式 一.不使用策略模式 package main import "fmt" type User struct { Name string } func (this User) travel(t string) { switch t { case "

  • Go语言基础函数基本用法及示例详解

    目录 概述 语法 函数定义 一.函数参数 无参数无返回 有参数有返回 函数值传递 函数引用传递 可变参数列表 无默认参数 函数作为参数 二.返回值 多个返回值 跳过返回值 匿名函数 匿名函数可以赋值给一个变量 为函数类型添加方法 总结 示例 概述 函数是基本的代码块,用于执行一个任务 语法 函数定义 func 函数名称( 参数列表] ) (返回值列表]){ 执行语句 } 一.函数参数 无参数无返回 func add() 有参数有返回 func add(a, b int) int 函数值传递 fu

  • Go语言基础go fmt命令使用示例详解

    go fmt 命令主要是用来帮你格式化所写好的代码文件[很多第三方集成软件都是使用了go fmt命令] 一.使用: go fmt <文件名>.go 使用go fmt命令,更多时候是用gofmt,而且需要参数 -w,否则格式化结果不会写入文件.gofmt -w src,可以格式化整个项目. 二.参数介绍 -l 显示那些需要格式化的文件 -w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出. -r 添加形如"a[b:len(a)] -> a[b:]"的重写规

  • Go语言基础go install命令使用示例详解

    目录 go install 一.使用 二.包名和目录名的关系 三.注意 go install 编译并安装代码包,对于库,会生成目标库文件,并且放置到GOPATH/pgk目录下. 对于可执文件,会生成目标可执行文件,并且放置到GOPATH/bin目录下 一.使用 命令 描述 go install lib 编译安装package lib,会为main包在bin下生成可执行exe文件 go install lib2 lib/util 同时编译安装lib2和lib/util两个package. 二.包名

随机推荐