目录
5.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是()
6.设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为()
后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
题目:
【单选题】
1.下列有关大O表示法的说法错误的是()
A.大O表示法只是对程序执行时间的一个估算
B.大O表示法只保留最高阶项
C.大O表示法会保留一个系数来更准确的表示复杂度
D.大O表示法一般表示的是算法最差的运行时间
2.分析以下函数的时间复杂度()
void fun(int n)
{
int i = l;
while (i <= n)
i = i * 2;
}
A.O(n)
B.O(n ^ 2)
C.O(nlogn)
D.O(logn)
3.分析以下程序的时间复杂度()
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
a[i][j] = i * j;
A.O(n)
B.O(n^2)
C.O(nlogn)
D.O(logn)
4.下面算法的时间复杂度是()
int f(unsigned int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * f(n - 1);
}
A.O(n)
B.O(n^2)
C.O(nlogn)
D.O(logn)
5.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是()
A.O(n)
B.O(n^2)
C.O(nlogn)
D.O(logn)
6.设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为()
A.O(n)
B.O(n^2)
C.O(nlogn)
D.O(logn)
【编程题】
7.消失的数字 力扣
数组nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
8.数组中数字出现的次数力扣
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
解析:
1.答案:C
解析:大O是一个渐进表示法,不会去表示精确的次数,cpu的运算速度很快,估计精确的没有意义。
2.答案:D
解析: 此函数有一个循环,但是循环没有被执行n次,i每次都是2倍进行递增,所以循环只会被执行log2(n)次。
3.答案:B
解析:程序有两次循环,每个循环都有n次操作,所以时间复杂度为n^2
4.答案:A
解析:此函数会被递归调用n - 1次,每次操作都是一次,所以时间复杂度为n
5.答案:A
解析:此题目中,数组元素有序,所以a,b两个数可以分别从开始和结尾处开始搜,根据首尾元素的和是否大于sum,决定搜索的移动,整个数组被搜索一遍,就可以得到结果,所以最好时间复杂度为n
6.答案:A
解析:
T(n)
=T(n-1)+n
=T(n-2)+(n-1)+n
=T(n-3)+(n-2)+(n-1)+n
...
=T(0)+1+2+...+(n-2)+(n-1)+n
=1+1+2+...+(n-2)+(n-1)+n
从递推公式中可以看到,第n项的值等于1到n的累加值,需要遍历n个元素
所以时间复杂度为n
7.
求和相减: int missingNumber(int* nums, int numsSize) { int sum = 0; for(int i = 0; i< numsSize+1;i++) { sum+=i; } for(int i = 0;i <numsSize;i++) { sum-=nums[i]; } return sum; }
8.
分组求异或和: int* singleNumbers(int* nums, int numsSize, int* returnSize){ //对所有元素进行异或运算,结果为两不同数字的异或和 mask。 int mask = 0; for (int i = 0; i < numsSize; i++) { mask ^= nums[i]; } //找到 mask 的不为 0 的最低位。 int div = 1; while ((div & mask) == 0) { div <<= 1; } //按照不为 0 的最低位分为两组。 //两不同的数分别在两组中,且其他相同的两个数都会分在同一组。 //对每一组分别求异或和即得到两不同的数字。 int a = 0, b = 0; for (int i = 0; i < numsSize; i++) { if (nums[i] & div) { a ^= nums[i]; } else { b ^= nums[i]; } } *returnSize = 2; int* ret = malloc(sizeof(int) * 2); ret[0] = a; ret[1] = b; return ret; }