java筑基小成之牛客网练习

1

将数据元素2,4,6,8, 10, 12, 14, 16, 18,20, 22依次存放于一个一维数组中,然后采用折半查找方法查找数组元素16,被比较过的数组元素的轨迹依次为(a)

12,18,14,16
12,14, 18,16
6,9,7,8
6,7,9,8

中间数12<16,说明在该数在12右侧。如果剩下的子序列有奇数个数字,就取中间那个为middle。如果有偶数个数字,取前一半的最后一个为middle。

2

设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以行为内存放时,元素A[5,8]的存储首地址为(d)

BA+141
BA+180
BA+222
BA+225

(4*10+7)*3=141

3

具有 n 个整数的数组 A=[29,6,28,20,2,24] 使用插入排序( Insertion Sort )算法排序,算法伪代码如下:

经过三趟排序后,数组 A 的排列状态将是(c)

6,29,28,20,2,24
6,28,20,2,24,29
6,20,28,29,2,24
2,6,20,24,28,29

 

4

数组定义为“ int a [ 4 ] ; ”,表达式 (d ) 是错误的。 

*a
a [ 0 ]
a
a++

5

char str[]=”Hello”,sizeof(str)=(c)

4
5
6
7

注意char str[] = {'a','b'};和char *str = {'a','b'}中求sizeof(str)的区别,前者是求数组所占内存空间,后者是元素地址空间

6

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

m[i] = 1 + max{0,m[k](A[k] < A[i],1≤k < i )}
m[i] = 1 + m[k] (k = i - 1 && i > 1)
m[i] = 1 + max{-1,m[k] (A[k] ≤ A[i],1≤k < i )}
m[i] = max{0,m[k](A[k] < A[i],1≤k < i )}

7

从逻辑结构上看,n维向量的每个元素均属于1个n维向量(a)

类似二维数组与一位数组

8

采用压缩存储之后,下三角矩阵的存储空间可以节约一半,这样的说法正确吗?b

正确
不正确

假设是2*2的矩阵,下三角矩阵有3个元素,只是少了一个元素,没有达到减少一半的空间。加上对角线的元素。

9

若有以下程序段:

……

int a[]={4,0,2,3,1},i,j,t;

for(i=1;i<5;i++)

{

t=a[i];

j=i-1;

while(j>=0&&t>a[j])

{

a[j+1]=a[j];

--j;

}

a[j+1]=t;

}

……

则该程序段的功能是:      b

对数组a进行插入排序(升序)
对数组a进行插入排序(降序)
对数组a进行选择排序(升序)
对数组a进行选择排序(降序)

在第i次排序中,前i-1个元素始终是有序的,此时只需把第i个元素插入到有序的序列中即可,故代码中体现的是插入排序的思想。代码中对当前a[i]>a[j](0<=k<i-1)是否成立进行判断,若成立则将a[j]往后移(即大的数排在前面,小的数排在后面),故代码中的排序原则为降序排。
       结合所述答案为插入排序(降序),故选B。

10

以下操作中,数组比链表速度更快的是____

ace

原地逆序
头部插入
返回中间节点
返回头部节点
选择随机节点

A选项,如果是数组只要遍历一半元素就可以了,翻转的思想类似于字符串逆序,但链表如果要完成逆序,就算只是修改指针也要把所有的元素遍历完,所以相比而言数组还是比链表快的。

B链表只需插入一个节点,数组需移动n个元素

C选项的访问中间节点,数组可以通过array[length/2]访问,链表需要依次查找到中间节点。

D头结点都一样

E 数组是顺序存储的线性表,相对于链表而言主要的优点就是可以通过下标随机访问数组中的任意元素。

1

下面哪项是数组优于链表的特点?

正确答案: D 

方便删除
方便插入
长度可变
存储空间小

1: 数组内存空间少比链表少

2:数组支持随机访问,链表不具有随机访问的特性

3:插入和删除是链表优于数组,数组需要移动被删除或者插入位置之后的元素

https://blog.csdn.net/u014082714/article/details/44259029

2

一维数组与线性表的区别是(    )。

正确答案: A 

前者长度固定,后者长度可变
后者长度固定,前者长度可变
两者长度均固定
两者长度均可变

数组的长度是固定不变的,数组是线性表的一种。而线性表有多种形式,其长度可变。

数组的长度在初始值就已经设定好,而线性表的长度是动态可变的。

3

请问对一个排好序的数组进行查找,用平均时间复杂度最小的算法,时间复杂度为()

正确答案: B 

O(n)
O(lgn)
O(nlgn)
O(1)

二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

时间复杂度无非就是while循环的次数!

总共有n个元素,

渐渐跟下去就是n,n/2,n/4,....n/2^k,其中k就是循环的次数

由于你n/2^k取整后>=1

即令n/2^k=1

可得k=log2n,(是以2为底,n的对数)

所以时间复杂度可以表示O()=O(logn)

4

在n个结点的线性表的数组实现中,算法的时间复杂性是O(1)的操作是()

正确答案: A

访问第i个结点(1<=i<=n)和求第i个结点的直接前驱(2<=i<=n)
在第i个结点后插入一个新结点(1<=i<=n)
删除第i个结点(1<=i<=n)
以上都不对

访问是O(1) ,删除和插入都是o(n) ,题目讲是数组实现的线性表,数组是连续空间,基指针加上偏移就能访问,不用查找(查找时间复杂度为o(n) )。

5

在C语言中,若有定义:int a[4][10](其中0<=i<4,0<=j<10);则下列选项中对数组元素a[i][j]引用错误的是()

正确答案: A 

*(a+i)+j
*(&a[0][0]+10*i+j)
*(a[i]+j)
*(*(a+i)+j)

a[i]就是:a加i取值—取到的值是地址,记为p。

a[i][j]就是:p加j取值—取到的值是数值,就是最后的结果!

而*(a+i)和a[i]等价;

*(*(a+i)+j)和a[i][j]等价。

 

6

设某数据结构的二元组形式表示为 A=(D , R) , D={01 , 02 , 03 , 04 , 05 , 06 , 07 , 08 , 09} , R={r} , r={<01 , 02> , <01 ,03> , <01 , 04> , <02 , 05> , <02 , 06> , <03 , 07> , <03 , 08> , <03 , 09>} ,则数据结构A是() 。

正确答案: B 

线性结构
树型结构
物理结构
图型结构

二元组的存储,A=(D,R),D表示数据,R表示关系,这是二元组的定义,由题可知,01元素与02,03,04均有关系,所以不可能是线性结构,至于图,一般是用{V,{E}}来表示,V表示顶点,{E}表示边,乍一看是挺符合二元组的表示,但是这里要提一下图和树的区别,树是用来描述一对多的关系,而图是用来描述多对多的关系,根据题中所给关系可以很清楚的看到,是属于1对多,所以应该是树形,而不是图型。

7

稀疏矩阵一般的压缩存储方式有两种,即 。

正确答案: C 

二维数组和三维数组
三元组和散列
三元组和十字链表
散列和十字链表

所谓三元组就是一个元素存放三个信息,矩阵中的行号,列号以及值,这样就可以不存放值为0的元素,实现压缩。 十字链表相当于是邻接表和逆邻接表的合集,在一个元素里面存放了值以及出度表和入度表,这样也不需要像邻接矩阵那样存放大量0元素,而且找一个节点的入节点和找出节点一样快。

8

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

正确答案: B  

55
45
36
16

三维数组:

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

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

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

总个数:5*3*3

9

稀疏矩阵压缩存储后,必会失去随机存取功能()

正确答案: A 

三元组表示法就是在存储非零元的同时,存储该元素所对应的行下标和列下标。稀疏矩阵中的每一个非零元素由一个三元组(i,j,aij)唯一确定。矩阵中所有非零元素存放在由三元组组成的数组中。

10

若要删除 book 表中的所有数据,如下哪些语法是错误的?

正确答案: A D 

drop table book;
truncate table book;
delete from book;
del *from book;

A: drop table book 是删除整个表,题目的潜在意思是删除表中的数据而并非删除整个表。因此A错。
B: truncate table book 是删除表中的数据,删除速度比delete更快,无法撤回(回退)。
C: delete from book  删除数据表中的数据,可以回退,可添加where 子句。
D:语法错误。

1查看解析

归并排序算法的时间复杂度是()。

 

正确答案: D   

O(log2N)
O(N)
O(N的平方)
O(Nlog2N)

归并排序左右分别排好序,然后两部分外排,采用递归当时接着拆分,递归时间复杂度估计采用master公式,该流程公式为:

T(N)=T(N/2)+T(N/2)+O(N)

a=2,b=2,d=1,照公式求得为O(NlogN)

2查看解析

采用简单选择排序,比较次数与移动次数分别为()

正确答案: C   

O(n),O(logn)
O(logn),O(n*n)
O(n*n),O(n)
O(nlogn),O(n)

简单选择排序它最大的特点是交换移动数据次数相当少,这样也就节约了相应的时间,无论最好最坏的情况,其比较次数都是一样多。第 i 次排序需要进行n-i 次关键字的比较,此时需要比较n-1+n-2+...+1=n(n-1)/2次,时间复杂度为O(n^2)。对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始排序,交换次数为n-1次,复杂度为O(n)。

3

若有语句

 

1

char s1[10], s2[10] = {"books"};

则能将字符串 books 存放到数组 s1 的正确语句是(   )

正确答案: A  

strcpy(s1, s2);
s1 = {"books"};
s1 = s2;
strcpy(s2, s1);

c表示将s2这个对象赋值给s1,而A表示将s2中的books字符串赋值给s1,b表示创建了一个books字符

4

设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序子表,则用归并排序的方法对该记录关键字序列进行一趟归并后的结果为(   )。

正确答案: A   

15,25,35,50,20,40,80,85,36,70
15,25,35,50,80,20,85,40,70,36
15,25,35,50,80,85,20,36,40,70
15,25,35,50,80,20,36,40,70,85

原序列共分成5段有序,第1段:25,50.第2段:15,35.第3段:80,85.第4段:20,40.第5段:36,70.第1段与第2段归并,结果为:15,25,35,50.第3段与第4段归并结果为:20,40,80,85.第5段落单了,则原样照抄.结果为A

快速排序是基于比较的排序算法中平均性能最好的一种排序。( )

正确答案: A  

正确
错误

快速排序是在比较排序中平均性能最好的,但还有线性时间排序啊,比如:基数排序,计数排序,桶排序

拓扑排序运算只能用于(    )

正确答案: C  

带权有向图
连通无向图
有向无环图
无向图

只有有向无环图才可以进行拓扑排序。

判断下列说法是否正确:在快速排序、堆排序、归并排序和插入排序中,堆排序所需要的附加存储开销最大。()

 

正确答案: B   

正确
错误

堆排序的空间开销为O(1),插入排序的空间开销为O(1),归并排序的空间开销为O(n),快速排序的空间开销为O(logn)

某地电信局要对业务号码进行梳理,需要检测开通的市话号码是否存在某一个是另一个的前缀的情况,以简化电话交换机的逻辑。例如:某用户号码是“11001100”,但与"110"报警电话产生前缀配对。已知市话号码最长8位,最短3位,并且所有3位的电话号码都以1开头。由于市话号码众多,长度也未必一直,高效的算法可以用O(n)的时间复杂度完成检测(n为开通市话号码个数,数量是千万级的)。那么,该算法最坏情况下需要耗费大约________内存空间。

正确答案: C   

5GB
500MB
50MB
5MB

最长8位  最短3位, 3位都是1开头 
最短3位有10^2=100种, 
四位:10^4=10000,五位:10^5=100000,六位:10^6=1000000,七位:10^7=10000000,八位:10^8=10000000 
一位号码4BITE, 
其实是比较前7位,相加 11110101*4*8/4/1024(Kb)/1024(Mb)=42MB  取(50Mb)

在Java中,下列说法错误的有( )

正确答案: B C D   

数组是一种对象
数组属于一种原生类
int number = []{31,23,33,43,35,63};
数组的大小可以任意改变

A:数组是对象,int float char这些基本类型不是对象。

行为:
基本类型只是一个值,没有任何行为
对象类型有自己的行为
内存分配:
基本类型在栈内分配
对象在堆内分配
对象引用保存在栈内
引用与值:
基本类型是值类型,仅表示一个值,保存在栈内
引用类型分两部分,对象引用保存在栈内,对象保存在堆内,
访问变量,是使用的引用找对象

B:不是,属于引用数据类型,因为声明数组需要分配堆栈空间
D:大小一旦指定,不能改变

下列给定程序中,函数fun的功能是:进行数字字符转换。若形参ch中是数字字符'0'~'9',则将'0'转换成'9','1'转换成'8', '2'转换成'7',…, '9'转换成'0';如果是其他字符则保持不变,并将转换后的结果作为函数值返回。 
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 
试题程序。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#include<stdio.h>

_____ fun(char ch)

{

    if(ch>='0'&& _______)

        return'9'-(ch- ______);

    return ch;

}

main( )

    char c1,c2;

    printf("\nThe result:\n");

    c1='2';

    c2=fun(c1);

    printf("c1=%c c2=%c\n",c1,c2);

    c1='8';

    c2=fun(c1);

    printf("c1=%c c2=%c\n",c1,c2);

    c1='a';

    c2=fun(c1);

    printf("c1=%c c2=%c\n",c1,c2);

}

 

正确答案: A B   

int ch<='9'  '0'
char   ch<='9'  '0'
char   ch<='9'  0
int ch<='9'  0

1,返回的是转换后的字符,因此是char
2,判断字符在’0’到’9’范围内,因此是 ch<=’9’
3,’9’-ch 得到的是两个字符之间的差值,是整型,要转成对应的字符要+’0’,在括号内为j减

下列排序方法中,最坏情况下比较次数最少的是(  )。

正确答案: D   

冒泡排序
简单选择排序
直接插入排序
堆排序

某种排序方法对关键字序列(33,12,44,10,6,8,17)进行排序时,前三趟排序的结果如下:

6,12,44,10,33,8,17

6,8,44,10,33,12,17

6,8,10,44,33,12,17

则采用的排序方法是()

正确答案: D   

希尔排序
归并排序
快速排序
选择排序

A 希尔排序:因为33和6交换,那么按照分隔的距离12需要和8进行交换,和结果不符合,所以排除
B 归并排序:归并第一趟后得出【12,33,10,44】【6,8,17】,和结果不符合,所以排除
C 快速排序:按照快排性质,选出的元素需要满足左边比它小,右边比它大的性质,第一趟只有6满足,第二趟只有8满足,第三趟只有10满足,可以看出这种选元素的方式并不符合快排,也就是说,没有一种选取元素算法能够如此精确的选出6,8,10这三个数来,所以排除
D 选择排序:每一趟选出最小的数,满足选择排序性质

在二叉排序树(二叉搜索树)中,最小值结点的( )。

正确答案: A   

左孩子一定为空指针
右孩子一定为空指针
左、右指针均为空
左、右指针均不为空

对于二叉树排序,左子树值一定比节点值小,右子树值一定比节点值大,因节点值是最小值,则其没有左子树

在快速排序中,要使最坏情况的空间复杂度为O(log2n )则要对快速排序作(  )修改。

 

 

正确答案: A   

划分元素为三者取中
采用表排序
先排最小集合
先排大集合

快速排序的思想:

  1. 先从数列中取出一个数作为基准数
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
  3. 再对左右区间重复第二步,直到各区间只有一个数

对序列{15,9,7,8,20,-1,4}用希尔排序方法排序,经一趟后序列变为{15,-1,4,8,20,9,7}则该次采用的增量是()

正确答案: B   

1
4
3
2

5,9,7,8,20,-1,4,排序后,9和-1交换,即1号和5号互换,增量为5-1=4

嘤嘤嘤,我基础不扎实,天真地以为是5号和1号之间有3个元素,增量为3。

所以,增量为是直接插入排序

对于一个线性表既要求能够进行较快速地的插入和删除,又要求存储结构能反映数据之间的逻辑关系,则应该用()

正确答案: B   

顺序存储方式
链式存储方式
散列存储方式
以上均可以

线性表中某数据与其他数据之间的逻辑关系其中之一表现为相邻元素之间相互可达,数据序号为i的数据通过自身信息就能直接达到序号为i+1的元素。散列存储明显不满足这一条件,而顺序存储插入和删除操作慢,所以最合适的是链表。双向链表可以通过自身的节点到达相邻的元素,逻辑上与相邻和有序一致。

假设 8 行 10 列的二维数组a[1…8 , 1…10] 分别以行序为主序和以列序为主序顺序存储时,其首地址相同,那么以行序为主序时元素 a[3, 5] 的地址与以列序为主序时() 元素相同。注意:第一个元素为a[1][1]

正确答案: D   

a[7,3]
a[8,3]
a[3,4]
ABC都不对

设数组首地址为SA:

以行序为主序时,a[3][5]首地址(相当于a[3][4]的末地址)为 SA + (3-1)×10 + (5 - 1) = SA + 24.

以列序为主序时,设所求列号为m,行号为n,即a[m][n];

SA + (m-1)×8 + (n - 1) = SA + 24;

化简:

8m + n = 33;

穷举法求得唯一解:m = 4,n = 1;

即a[4][1],则ABC都不对,选D。

下列排序算法中,其中()是稳定的

正确答案: D  

堆排序,起泡排序
快速排序,堆排序
直接选择排序,归并排序
归并排序,起泡排序

选快希堆不稳(这几种排序是不稳定的), 堆归选基均不变(这几种排序的时间复杂度不变化)

字符序列(‘D’,’Q’, ‘U’,  ‘I’, ‘A’, ’N')只能是下列哪个排序算法两趟排序后的结果?

正确答案: C   

选择排序
冒泡排序
插入排序
堆排序

QUDIAN

最小字母为A 最大字母为U,若升序排序完成顺序应该是ADINQU

两趟排序导致QU是有序的,其他四个字母还无序,选择排序则QU应该在后面,冒泡和堆排序两趟也会使元素到达他最终位置,所以排除

选择C

Which statement declares a variable a which is suitable for referring to an array of 50 string objects?(Java)

正确答案: B C F   

char a[][];
String a[];
String[] a;
Object a[50];
String a[50];
Object a[];

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值