今天参加面试的时候面试官问了这个问题,当时很快速的想出了三种解决方案,当时还自我感觉挺好,回来后跟师兄一说,师兄说这个你没想出最好的方案来。: (
问题描述
有一个数组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,