当前位置: 首页 > article >正文

面试题-消失的数字-异或

消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O(n) 时间内完成吗?
示例:
输入:[3,0,1]
输出:2

int missingNumber(int* nums, int numsSize) {}

分析

本题对时间复杂度的要求是O(n)。
利用异或相同为0,不同为1;也就是相同的数异或为0;任何数异或0,结果为原来的数。
思路1:单身狗思想:将数组中所有数异或起来的值,再与0~numsSize之间的值异或,最后的结果就是没出现过的数。

注:
异或符合交换律和结合律
1 ^ 1 ^ 3 = 3
1 ^ 3 ^ 1 = 3

思路2:公式法:0~numsSize的和减数组元素的和,结果就是没出现过的数。

代码

代码1

int missingNumber(int* nums, int numsSize) 
{
    int val = 0;
    for(int i=0; i<numsSize; i++)
    {
        val ^= nums[i];
    }
    for(int i=0; i<=numsSize; i++)
    {
        val ^= i;
    }
    return val;
}

代码解释:
因为任何数异或0为原数,所以使用val=0为原始值。
又因为异或符合交换律和结合律,所以
val=0 ^ ( 0 ^ 1 ^ 3 ) ^ ( 0 ^ 1 ^ 2 ^ 3 ) = 2

代码2:

int missingNumber(int* nums, int numsSize) 
{
    int sum = numsSize*(numsSize+1)/2;
    for(int i=0; i<numsSize; i++)
    {
        sum -= nums[i];
    }
    return sum;
}

http://www.kler.cn/a/530330.html

相关文章:

  • 【Linux】 冯诺依曼体系与计算机系统架构全解
  • model.eval() model.train()
  • 如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
  • 优盘恢复原始容量工具
  • 【leetcode详解】T3175(一点反思)
  • 代码随想录|动态规划 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
  • 线性回归的损失和优化02
  • 小红的合数寻找
  • DeepSeek 详细使用教程
  • 笔灵ai写作技术浅析(三):深度学习
  • 携程Java开发面试题及参考答案 (200道-上)
  • 深度学习 DAY3:NLP发展史(全网最全)
  • 【Windows7和Windows10下从零搭建Qt+Leaflet开发环境】
  • doris:主键模型的更新并发控制
  • css三角图标
  • Linux的循环,bash的循环
  • 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B与vllm实现推理加速的正确姿势(一)
  • 【C语言】结构体对齐规则
  • MySQL是怎么实现事务隔离的?
  • [权限提升] Windows 提权 维持 — 系统错误配置提权 - PATH 环境变量提权
  • Linux环境下测试服务器的DDR5内存性能
  • C语言 --- 分支
  • 【Leetcode 每日一题】598. 区间加法 II
  • 知识库管理在提升企业决策效率与知识共享中的应用探讨
  • Java 大视界 -- Java 大数据在智慧农业中的应用与实践(70)
  • 深入解析 CSS 中不常用属性及其相互作用