牛客网专项练习总结(一)

1.二分查找要求元素 (   );

 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。

 2.假设以行序为主序存储二维数组A=array[100][100],设每个数据元素占2个存储单元,基地址A[0][0]为10,则A[5,5]的地址为()。

选A             分析:

根据公式 基地址+(n(i-1)+j-1)b=10+(100*5+5)*2=1020

3.若数组A[0…m-1][0…n-1]按列优先顺序存储,则aij地址为( )。


 

选A

分析:1.将i,j=0代入,排除C,D;(这个只是排除错误答案) 2.因为列主序,所以aij前有j列*m个+i个元素。

4.数组A[0..4,-1..-3,5..7]中含有元素的个数()

A.45          B. 45                 C.36                       D.16

分析:

这是个三维数组:

长的边 个数:4-0+1=5

宽的边 个数 :(-1)-(-3)+1=3

高的边个数 :7-5+1=3

总个数:5*3*3

5.稀疏矩阵压缩的存储方法是:()

A.三元组              B.二维数组                     C.散列                      D.十字链表

分析:数据结构C++版,王红梅编著,十一五国家级规划教材。稀疏矩阵可用三元组或十字链表,十字链表更适合矩阵的加法乘法等操作

6.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为()。

选D                      分析:            长度等于尾指针减去头指针加上总长度然后对总长度取余

r > f 时,应该是A;r < f 时,应该是C。D是一般情况,包含了 r > f 和 r < f 的情况,

 

7.希望用最快的速度从一个无序数组中挑选出其中前十个最大的元素,在以下的排序方法中()

选B

堆排序建堆需要o(n),每次取最大需要o(lgn),所以只要o(n+10lgn)

基数排序需要全部排好才能取出10个最大的,o(d(n+k))

用堆排序最好,因为堆排序不需要等整个排序结束就可挑出前50个最大元素,而快速排序和基数排序都需等待整个排序结束才能知道前50个最大元素。

8.给出一个由 n 个数组成的序列 A[1…n] ,要求找出它的最长单调上升子序列,设 m[i] ( 1 ≤ i ≤ n ),表示以 A[i] 结尾的最长单调上升子序列的长度,则 m[1] = 1 , m[i] ( 1 < i ≤ n )为( )。

 选A                               注意一个坑。
m[i] 表示 A[i] 结尾的最长单调上升子序列的长度
所以A[i]这个数一定要在
m[n]的值也不是A[n]的最长单调上升子序列的值

对着答案想一下递归就能明白了。m[k](…)的意思是,所有k符合括号里条件的m[k]集合

9.声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是()

选C        分析:

  首先题目说要声明一个数组指针,  一般我们想到的数组指针是 随便来一个 int(*p)[10],    然后又说每个元素是一个函数指针,那么我们随便来一个 函数指针  int (*pf)(int *) . 然后把(*p)[10]作为一个整体替代 pf     即   int(*(*p)[10]))(int *);    分析: 判断一个复杂式子看最高优先级的,*p是一个指针,然后(*p)外面是[],所以是数组指针,(*p)[10])描述完毕,然后再看外面int(*)(int *)很明显,这是一个函数指针,所以这个数组中每个元素是函数指针

选C                        

分析:pa是执行1000次1000万连续地址的相加,pb是执行1000万次1000连续地址的相加,虽然相加次数是一样的,但是pa数组较长,跨的页较多,所以会产生较多次的缺页,导致执行速度较pb慢

发布了13 篇原创文章 · 获赞 0 · 访问量 404

猜你喜欢

转载自blog.csdn.net/weixin_45042315/article/details/104433603