java程序设计基础选择总结(3)

本文总结了关于Java程序设计基础的选择题,涵盖了栈、链表、队列、数组、链栈、二叉树、数据结构、字符串、数组指针等多个知识点,包括对各种操作的时间复杂度和存储结构特性的分析。

题目链接:https://www.nowcoder.com/test/question/done?tid=31324734&qid=2411

1、有栈S,按顺序ABCD进栈,则出栈顺序不可能存在的是______。

A、DCBA

B、BACD

C、BADC

D、CABD

正确答案:D

解析:CABD   C出栈 那么 AB一定还在栈里面 接下来只能是B出栈或者D进栈  不可能先出来A

2、链栈与顺序栈相比,其特点之一是通常不会出现栈满的情况。

A、正确

B、错误

正确答案:A

解析:采用链栈不必预先估计栈的最大容量,只要系统有可用空间,就不会溢出。

3、需要频繁的插入删除操作使用什么结构比较合适?

A、数组

B、队列

C、链表

D、栈

正确答案:C

解析:

数组和链表方式实现顺序表,各有其优缺点。数组的优点是较高的存储效率和快速的随机存取,缺点是数组不能动态的增长,并且在插入和删除时,平均会移动n/2的数据,不适用于随机位置插入和删除很频繁的操作。而链表家恰好具备此优点,一般来说链表的插入和删除基本是固定时间的,链表的缺点是不太适合于随机访问,而在连续访问时,链表也具有很好的表现。

队列(queue)和栈是一种操作受限的线性表。栈的操作受限表现在插入和删除只能对栈顶元素进行,删除的元素永远是最新插入的,即操作遵循后入先出(LIFO)原则。队列中的操作原则与栈的相反。删除的元素是最早插入到队列中的,就像排队一样,排在最前面的人将最先从队伍中出列。这样的操作原则常常称作先入先出。所以对于栈和队列的频繁随机插入删除不合适。

4、对于满足折半查找和分块查找条件的文件而言,无论它存在何种介质上,均能进行顺序查找,折半查找和分块查找()

A、对

B、错

正确答案:B

解析:存储在顺序介质如磁带上,无法随机读写自然无法二分与分块。

5、

For the following Java or C# code(3 Points),What will my Array3[2][2] returns?

1

2

3

4

5

6

int [][] myArray3 = 

new int[3][]{ 

new int[3]{5,6,2}, 

new int[5]{6,9,7,8,3}, 

new int[2]{3,2}

}; 

A、9

B、2

C、6

D、overflow

正确答案:D

解析:

题考查的是基本的语法知识。无论是Java语言还是C#语言,在计算机的基本语法中,数组始终是以0开始,对于一个具有n个元素的一位数组,其下标是从0到n-1。因此本例中定义的二维数组myArray3[][],第一个元素对应的下标表示为myArray3[0][0],问题中的myArray3[2][2]理解为第三行第三个元素,查找原始数据发现,第三行仅包含两个元素,超出了数组可访问的位置,发生溢出。

Java中会报出异常java.lang.ArrayIndexOutOfBoundsException。

6、中序遍历二叉链存储的二叉树时,一般要用堆栈;中序遍历检索二叉树时,也必须使用堆栈()

A、对

B、错

正确答案:B

解析:

二叉链存储法也叫孩子兄弟法,左指针指向左孩子,右指针指向右兄弟。而中序遍历的顺序是左孩子,根,右孩子。这种遍历顺序与存储结构不同,因此需要堆栈保存中间结果。

而中序遍历检索二叉树时,由于其存储结构跟遍历顺序相符,因此不需要用堆栈。

7、循环队列SQ的存储空间是数组d[m],队头、队尾指针分别是front和rear,则执行出队后其头指针front值是()

A、front=front+1

B、front=(front+1)%(m-1)

C、front=(front-1)%m

D、front=(front+1)%m

正确答案:D

解析:

循环队列

进队:队尾指针(rear+1)%m

出队:对头指针(front+1)%m

m为数组容量

8、在一个长度为n的顺序表的任意位置插入一个新元素的渐进时间复杂度为()

A、O(n)

B、O(n/2)

C、O(1)

D、O(n的平方)

正确答案:A

解析:渐进时间复杂度是指n趋于无穷时的复杂度。向有序表中任意一个位置插入元素,插入位置之后的元素依次挪动一个位置,假设元素插入的位置坐标为k,则时间复杂度为O(k),渐进时间复杂度为O(n)

9、在C语言中,顺序存储长度为3的字符串,需要占用(    )个字节。

A、3

B、4

C、6

D、12

正确答案:B

解析:C语言中,字符串默认每个占用1字节,末尾还有'\0',所以一共是4字节

10、int A[2][3]={1,2,3,4,5,6}; 则A[1][0]和*(*(A+1)+1)的值分别是()。

A、4  5

B、4  3

C、3  5

D、3  4

正确答案:A

解析:

数组名有两重属性

1.数据结构的一个对象(数据结构为当前数组),在java中数组就是一个对象

2.某些情况下自动退化成指向第一个元素的常量指针

本题中:

A+1为指向第二个元素的常量指针

*(A+1)为第二个元素,(第二个元素为int [3],即{4,5,6})

同时对象名也是指向第一个元素的常量指针。

所以*(A+1)也是指向元素4的指针,

那么*(A+1)+1为指向元素5的指针。

11、若要定义一个具有 5 元素的整型数组,以下错误的定义语句是(   )。

A、int a[5] = {0};

B、int a[] = {0, 0, 0, 0, 0};

C、int a[2+3];

D、int i = 5, a[i];

正确答案:D

解析:i是整形变量,数组大小的定义只能是整形常量

12、入栈操作和入队列操作在链式存储结构上实现时不需要考虑栈溢出的情况。(  )

A、正确

B、错误

正确答案:A

解析:式存储结构是动态分配空间的

13、假设以数组Data[0..m-1]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为

A、(rear-front+m)%m

B、rear-front+1

C、(front-rear+m)%m

D、(rear-front)%m

正确答案:A

解析:循环队列中元素个数计算方法是固定的,即(尾-头)%长度,但是由于是循环队列所以尾可能会小于头,所以要加上长度,使尾-头保持是正整数,然后再对长度求余,即元素个数

14、

下列程序的功能是将 s 中的字符串按长度由小到大排列,请为横线处选择合适的程序()

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#include <stdio.h>

 

#include <string.h>

 

void f(char *p[],int n) {

 

char *t;

 

int i,j;

 

for(i=0;i<n-1;i++)

 

for(j=i+1;j<n;j++)

 

if(strlen(*(p+i))>strlen(*(p+j))) {

 

t=*(p+i);

 

*(p+i)=*(p+j);

 

*(p+j)=t;

}

}

main() {

 

char *s[]={“abc”,”abcdef”,”abbd”};

 

f(s,3);

 

for(int i=0;i<3;i++)

 

printf(“%s\n”,____);

 

}

A、s+i

B、s[i]

C、*s[i]

D、&s[i]

正确答案:B

解析:原题目中提取字符串长度不对

15、已知操作符包括‘ +’、‘ -’、‘ *’、‘ /’、‘ (’和‘ )’。将中缀表达式 a+b-a*((c+d)/e-f)+g 转换为后缀表达式 ab+acd+e/f-*-g+时,用栈来存放暂时还不能确定运算次序的操作符。若栈初始时为空,则转换过程中同时保存在栈中的操作符的最大个数是( )。

A、5

B、7

C、8

D、11

正确答案:A

解析:写成伪代码是这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

stack 操作符栈;

for i=1 to n{

    if 当前操作符是操作数

        直接打印;

    else if 当前操作符是操作符{

        if 当前操作符是'('

            压入栈内;

        else if 当前操作符是')'

            不断弹出并打印栈顶元素直至栈顶为'(';

            弹出栈顶;

        else if 当前操作符优先级高于栈顶操作符 || 栈为空

            压入栈内;

        else

            不断弹出并打印栈顶元素直至栈顶优先级不大于当前元素;

            当前操作符入栈;

 

    }

}

打印栈中剩余操作符;

优先级从低至高:(、+-、*/、^
回到本题,流程如下:(数字标明当前栈中元素个数)
遇+,入栈,1个
遇-,-的优先级不大于+,弹出+,压入-,1个
遇*,*的优先级大于-,入栈,2个
遇(,入栈,3个
遇(,入栈,4个
遇+,+的优先级大于(,入栈,5个
遇),弹出+,弹出(,3个
遇/,/的优先级大于(,入栈,4个
遇-,-的优先级不大于/,弹出/,压入-,4个
遇),弹出-,弹出(,2个
遇+,+的优先级不大于*,弹出*,压入+,2个
操作符遍历完毕,栈中最后自底而上为-和+,依次弹出。

综上,栈中元素最多的时候有5个。

16、一个非空广义表的表尾()

A、不能是子表

B、只能是子表

C、只能是原子

D、是原子或子表

正确答案:B

解析:

1)《数据结构》对广义表的表头和表尾是这样定义的: 
如果广义表LS=(a1,a2...an)非空,则 a1是LS的表头,其余元素组成的表(a2,a3,..an)是称为LS的表尾。 
根据定义,非空广义表的 表头是一个元素,它 可以是原子也可以是一个子表, 而表尾则必定是子表。例如:LS=(a,b),表头为a,表尾是(b)而不是b.另外:LS=(a)的表头为a,表尾为空表().
2)非空广义表,除表头外,其余元素构成的表称为表尾,所以非空广义表尾一定是个表

17、二维数组和多维数组均不是线性结构。( )

A、正确

B、错误

正确答案:A

解析:

线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

常用的线性结构有:线性表,栈,队列,双队列,数组,串。

非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。

常见的非线性结构有:二维数组,***数组,广义表,树(二叉树等),图。(其中***数组是由多个一维数组组成的,所以不再是线性结构)

18、数组指针和指针数组有什么区别 ?

A、数组指针只是一个指针变量,它占有内存中一个指针的存储空间

B、指针数组只是一个指针变量,它占有内存中一个指针的存储空间

C、指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间

D、数组指针是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间

正确答案:AC

解析:数组指针的本质是指针,这个指针指向数组,而指针数组的本质是数组,数组存放的元素是指针。

19、以下序列是堆的是( )

A、{20,30,40,35,50,45,60,38}

B、{60,40,50,35,30,45,38,20}

C、{60,50,40,30,35,45,38,20}

D、{60,45,50,35,38,40,30,20}

正确答案:ABD

解析:分别是小顶堆大顶堆大顶堆    都是层序遍历

20、下列关于数组与指针的区别描述正确的是?

A、数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。

B、用运算符sizeof 可以计算出数组的容量(字节数)

C、指针可以随时指向任意类型的内存块。

D、用运算符sizeof 可以计算出指针所指向内容的容量(字节数)

正确答案:B

解析:

A.堆上创建动态数组

B.sizeof(数组名)就是数组的容量

C.const指针不可以

D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是指针的容量。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值