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

leetcode面试题17.04:消失的数字(C语言版)

4e0949b7eb2d4b8ba5c00ab61d5eb971.png

思路1

先排序,再依次查找,如果下一个值不等于前一个+1,那么下一个值就是消失数字。

时间复杂度分析:冒泡排序的时间复杂度为O(N^2),qsort排序时间复杂度为O(N*logN)。因此该思路不可行。


思路2

求和0到N,再减去数组中求和的值。

时间复杂度分析:两次循环,结果为O(N)。因此该思路可行,但有内存溢出风险。(这边可以通过等差数列求和公式求和,这样只需要一次循环,速度更快)


思路3

通过异或操作符号,相同的值为0,不相同的值为1;因为有 a^a = 0 已经 0^a = a 这两条性质,第一次遍历循环把数组全部的元素异或,第二次遍历循环再把numSize大小的元素异或,那么就可以找到只出现了一次的数字,即为消失的数字。(可以通过下图辅助理解)

时间复杂度:两次次循环,结果为O(N)。因此该思路可行,同时没有溢出风险,是最优解。

0d65831c5483453ea4da2177595d0be7.png

思路2的代码:

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

ea7cf8603fdb457c94db050e6421e810.png

思路3的代码:

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

5b926df0f0eb4843b6a0ac3254af6569.png


http://www.kler.cn/news/334722.html

相关文章:

  • 【系统架构设计师】专题:系统分析和设计
  • 乌班图基础设施安装之Mysql8.0+Redis6.X安装
  • 【STM32开发之寄存器版】(三)-详解NVIC中断
  • 论文阅读:InternVL v1.5| How Far Are We to GPT-4V? 通过开源模型缩小与商业多模式模型的差距
  • SpringBoot在线教育平台:设计与实现的深度解析
  • Unity 快速定位到目标文件夹
  • [运维]3.containerd无法使用fluentd的问题
  • 简历投递经验01
  • 分布式锁--redission 最佳实践!
  • 17岁孩子开发AI应用,4个月入百万,人人都是AI产品经理的时代快来了
  • 助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
  • ThinkPHP和PHP的区别
  • 来自德国的义齿雕刻机电主轴SycoTec 4033
  • 阿里巴巴开源的FastJson 1反序列化漏洞复现攻击保姆级教程
  • Word办公自动化的一些方法
  • 【分页】Spring Boot 列表分页 + javaScript前台展示
  • 物联网智能设备:未来生活的变革者
  • 【五分钟学会】YOLO11 自定义数据集从训练到部署
  • 【web安全】——XXE漏洞
  • 睡眠对于生活的重要性