<时间复杂度>题目练习《数据结构(C语言版)》

目录 

题目:

【单选题】

1.下列有关大O表示法的说法错误的是()

2.分析以下函数的时间复杂度()

3.分析以下程序的时间复杂度()

4.下面算法的时间复杂度是()

5.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是()

6.设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为()

【编程题】

7.消失的数字 力扣

8.数组中数字出现的次数力扣

解析: 

后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                           ——By 作者:新晓·故知


题目:

【单选题】

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包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在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;
}

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                           ——By 作者:新晓·故知

猜你喜欢

转载自blog.csdn.net/m0_57859086/article/details/124048120