寒假作业Day 09
一、选择题
因为一开始的for循环,k<2NN,所以复杂度为2N方,而后面的M=10的while循环,则是10,复杂度为常数级,所以2N方+10,近似于N方,即O(N^2)
这是一个计算阶乘的递归函数,当n=0或者1的时候,无需递归,直接返回;而n=2开始,就需要递归n-1次,因此,递归调用的深度是n;又因为深度是n,而调用的时间复杂度为O(1),所以整个函数的时间复杂度为O(n)
这个函数中传递了一个n进去,初始化i=1,当i<=n时,i就一直乘以2,直到i>n时退出循环;我们拿几个数字举例子,n=1,那么循环1次;n=2,那么循环2次;n=4,那么循环3次…所以很明显,我们可以看出,这个函数的时间复杂度是O(logN)
解析:n近似=2 ^ i,则i近似=logN
4、动态顺序表中,( )操作需要检查是否需要扩容
A.删除 B.插入 C.初始化 D.清空
答案是插入:初始化会给一定的初始空间,不需要检查扩容;而删除和清空的意思其实大差不差,删除并不需要检查扩容,而是检查是否还有可以删除的元素;只有插入,需要检测是否有足够的空间使其可以插入元素进去
5、在长度为 X 的顺序表下标为 i 的位置前插入一个元素( 1 ≤ i ≤ X+1 ),元素的移动次数为( )
A. X - i + 1 B. X - i C. X D. X-1
答案选择B,X-i,如何计算大家可以自己画图解析~
二、编程题
int* runningSum(int* nums, int numsSize, int* returnSize){
int* a=(int*)malloc(sizeof(int)*numsSize);//首先要malloc一个新数组
if(a==NULL){
perror("malloc fail");
return NULL;
}
int i=0;
a[0]=nums[0];
for(i=1;i<numsSize;i++){
a[i]=nums[i]+a[i-1];//根据规律放值进去
}
*returnSize=numsSize;//返回的数组大小
return a;
}
//二分法
int searchInsert(int* nums, int numsSize, int target) {
int begin = 0;
int end = numsSize - 1;
while (begin <= end) {
int mid = begin + (end - begin) / 2;//是为了防止数值过大溢出,一般我们会想到的是(begin+end)/2
if (nums[mid] > target) {
end = mid - 1;
} else if (nums[mid] < target) {
begin = mid + 1;
} else {
return mid;
}
}
// 循环结束后,begin 是第一个大于 target 的元素的索引
// 因此,target 应该插入在 begin 的位置
return begin;
}