有一个数组data[n-1]存储了1~n中的n-1个数,问data中缺少的数字是多少【每日一题】

本文介绍了在一个包含1到n中n-1个数字的数组中,如何找出缺失的数字。基础方法包括排序、额外空间记录和加减法,但存在时间复杂度或空间复杂度问题。高级解决方案利用位运算的异或性质,提供了一个时间复杂度为O(n),空间复杂度为O(c),且无溢出问题的高效算法。
摘要由CSDN通过智能技术生成

今天参加面试的时候面试官问了这个问题,当时很快速的想出了三种解决方案,当时还自我感觉挺好,回来后跟师兄一说,师兄说这个你没想出最好的方案来。: (

问题描述

有一个数组data,大小是n-1,其中存储的是1~n中的数字,不重复,即1~n中只有一个数字不在该数组内,找出该数字。

基础方法

先把我想出的几种方法例举一下吧。

排序 时间复杂度O(nlogn),空间复杂度O(c)

算法描述

先将data中的元素排序,然后从头开始遍历,如果遍历中发现元素有间断,则为确实的数据。

该算法中,排序的时间复杂度为O(nlogn),然后再遍历一次,因此综合时间复杂度是O(nlogn),空间复杂度O(c)。

代码
#include <stdio.h>
#include <stdlib.h>

int cmp (const void *a, const void *b) { 
    return *(int *)a - *(int *)b; 
}

// 找到不存在的元素
// data: 目标数组
// n: 数组中元素的最大可能值
//    data数组的大小为n-1
int findLost(int data[], int n) {
    // 快排
    qsort(data, n - 1, sizeof(int), cmp);
    int i;
    for (i = 0; i < n; ++i) {
        if (data[i] != i + 1)   // 如果第i个数不等于i+1,则返回i+1
            return i + 1;
    }

    // 程序执行到这里说明前面1~n-1个数都不缺,缺第n个数
    return n;
}

int main(void) {
    int data[8] = {
  1, 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值