NewCoder(牛客)题集--Three

1.判断下列说法是否正确:所有内部排序方法都是基于关键字比较的排序方法。(  )

解:错误

解析:

常见的内部排序有:

  • 插入排序(直接插入排序):将待排序的数字逐渐插入到已排好序的元素序列中,需要关键字的比较。
  • 快速排序:通过一趟排序将待排序数列分割为两部分,一部分比基准值大,另一部分比基准值小,需要关键字的比较。
  • 选择排序(简单选择排序):从待排序序列中选择一个最大(或最小)的元素放在序列的首位置,直到所有的序列排列完成。需要关键字比较。
  • 归并排序:将序列先拆分为多个子序列,使子序列有序,再逐步合并,直至整个序列有序。需要关键字比较。
  • 冒泡排序:相邻元素逐个比较做交换。
  • 希尔排序:缩小增量排序,属于插入排序的一种。
  • 堆排序:大根堆的要求是每个节点的值都不大于其父节点的值,小根堆相反。

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

A.3       B.4             C.6              D.12

解:B

解析:char 、short 、int各占1、2、4个字节;字符串每个占用1字节,末尾还有'\0',所以一共是4字节

3.判断下列说法是否正确:一个n阶对称矩阵,矩阵元为Aij将其下三角部分以行序为主序存放在一维数组M[0,n(n+1)/2-1]中,设矩阵最左上角矩阵元为A00,则矩阵元A64对应的位置为M[25]。( )

解:正确

解析:将矩阵(下半个三角部分)的元素依次按照每行的元素添加到数组中,求的是A64前面有多少元素。

A00

A01  A11

……

……A64

根据数列的计算:0+1+2+3+4+5+6+5个元素,结果为25个元素,所以A64对应M[25]

4.具有12个关键字的有序表,折半查找的平均查找长度()

A.  3.1          B.  4                C.   2.5              D.5

解:A

解析:

将12个数画成完全二叉树,第一层有1个、第二次2个、第三层4个,第四层只有5个。

二分查找时:

第一层需要比较1次

第二两个数,每个比较2次

第三层四个数,每个比较3次

第四层五个数,每个比较4次

则平均查找长度即为:(1+2*2+3*4+4*5)/12 = 37/12 = 3.0833 

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

解:错

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

6.数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为( )。

A.SA+141       B.SA+144      C.SA+222      D.SA+225

解:C

解析:

先,本题的数组是从A[1][1]开始的,也就是说和所谓的数组从零开始没什么关系。

A[1][1]的起始地址为SA,那么A[1][2]为SA+3.....A[2][1]为SA+3*10.....A[i][j]为SA+((i-1)*10+(j-1))*3。

那么A[8][5]的起始地址就是SA+ (7*10+4)*3=SA+222.

7.一个5*4的矩阵,有多少个长方形?(正方形也算是长方形)

A.120         B.150              C.100          D.80

解:B

解析:长任取两个点C(6,2)*宽任取两个点C(5,2) = 15* 10 = 150

8.

A.14        B.18       C.20         D.24          E.None of the above

解:E

解析:

针对这样的题目在别的地方看到的比较好的方法是用树来表示

                                     10

                             8                  6

                       6         4        4       2

                   4     2    2  0    2   0

                2   0

图中树的节点数是15,所以是调用了15次

9.下面的排序算法中,不稳定的是()

A.起泡排序   B.折半插入排序   C.简单选择排序   D.希尔排序   E.基数排序   F.堆排序

解:CDF

解析:不稳定:一堆希尔快选

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

A.char a[][];       B.String a[];       C.String[] a;       D.Object a[50];       E.String a[50];       F.Object a[];

解:BCF

解析:

A:char[][] 定义了二位字符数组。在Java中,使用字符串对char数组赋值,必须使用toCharArray()方法进行转换。所以A错误。

B、C:在Java中定义String数组,有两种定义方式:String a[]和String[] a。所以B、C正确。

D、E:数组是一个引用类型变量 ,因此使用它定义一个变量时,仅仅定义了一个变量 ,这个引用变量还未指向任何有效的内存 ,因此定义数组不能指定数组的长度。所以D、E错误。

F:Object类是所有类的父类。子类其实是一种特殊的父类,因此子类对象可以直接赋值给父类引用变量,无须强制转换,这也被称为向上转型。

11.在下列关于“字符串”的陈述中,不正确的描述是()

A.字符串是一种特殊的线性表

B.字符串可以连续存储,也可以链式存储

C.字符串的长度必须大于零

D.‘’空串”与“空白串”不是同一个含义

解:C

解析:

  • 字符串的值中每个字符可以是字母、数字或其他字符组成的序列,组成线性表的每个元素就是一个单字符,所以是一种特殊的线性表,
  • 串是特殊的线性表,故其存储结构与线性表的存储结构类似,只不过组成串的结点是单个字符而已。
  • 字符串:是有零个或多个字符组成的有序序列,是计算机处理的最基本的非数值数据。
  • 空串是长度为0,内容为空;空白串是包含一个或多个空白字符‘ ’(空格键)的字符串。

12.通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入的排序算法是()

A.归并排序          B.选择排序            C.希尔排序          D.插入排序

解:D

解析:

插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

13.已知关键字序列为(51,22,83,46,75,18,68,30),按关键码字51进行一趟快速排序,完成后的序列为()

A.(30,22,18,46,51,75,68,83)

B.(30,18,22,46,51,75,83,68)

C.(30,18,22,46,51,75,68,83)

D.(18,22,30,46,51,68,75,83)

解:A

解析:

算法思想:首先在数组中选择一个基准点,然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high

指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前半部分开始

扫描,发现有元素大于基准点的值,就交换low和high位置的值,如此往复循环,直到low>=high,然后把基准点的值放到

high这个位置。一次排序就完成了。

第一趟的变化过程如下:

51,22,83,46,75,18,68,30  

30 ,22,83,46,75,18,68, 51  

30,22, 51 ,46,75,18,68, 83   

30,22, 18 ,46,75, 51 ,68,83 

30,22,18,46, 51 , 75 ,68,83  

14.希尔排序的组内排序采用的是 () 

A.直接插入排序        B.折半插入排序         C.快速排序          D.归并排序

解:A

解析:

希尔排序的思想是:先将待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序,

然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

15.有关插入排序的叙述,错误的是( )

A.插入排序在最坏情况下需要O(n2)时间

B.插入排序在最佳情况可在O(n)时间内完成

C.插入排序平均需要O(nlog2n)时间

D.插入排序的空间复杂度为O(1)

解:C

解析:插入排序平均需要O(n^2)时间

16.已知串S= ‘babab ' , 其 Next 数值序列为

A.0112          B.01233          C.01123          D.01223

解:C

解析:

符串的前缀和后缀(这里的前缀是不包括最后一个字符的子串,后缀是不包含第一个字符的子串)。

拿题目中的字符串a=''babab''举例,

  • 第一位0。
  • 第二位1。
  • 第三位,字符串是“bab”,这时候“bab”的前缀有b,ba;后缀有ab,b,可以看出前后缀相等的最长的字符串只有b,因为b的长度是1,所以这里第三位的next值就是1。
  • 第四位,字符串是“baba”,前缀是b,ba,bab;后缀是aba,ba,a。这里可以看出前后缀相等的最长的字符串是ba,长度是2,因此第四位的next值是2。
  • 第五位,字符串是“babab”,前缀是b,ba,bab,baba;后缀是abab,bab,ab,b。这里可以看出前后缀相等的最长的字符串是bab,长度是3,因此第五位的next值是3。

因此综合起来next值就是0 1 1 2 3

17.已知数据表A中每个元素距其最终位置不远,为节省时间排序,应采用什么方法排序?

A.堆排序                 B.插入排序            C.快速排序             D.选择排序

解:B

解析:

插入排序:如果平均每个元素离最终位置相距c个元素,则其复杂度为O(cn),一共n趟,每次比较c次;

快速排序:最好的、平均的复杂度都是O(nlog(n)),如果每次选择的中间数都最小或最大,那就是最坏的情况,复杂度是O(n*n);所以快速排序和元素的位置没有关系,跟选择的中间数有关。

堆排序:复杂度一直是O(nlog(n));

直接选择排序:跟元素位置没有关系,都要遍历n遍,每遍找出最小或最大数来,复杂度是O(n*n);

18.若有以下定义和语句:则输出结果是

A.4           B.5                 C.9                 D.10

解:A

解析:strcpy(s1,s2)这个函数是把s2字符串拷贝到s1这个字符串,同时也把s2的 '\0' 拷过去,所以覆盖了s1的所有字符,所以strcpy执行完后是“1234” strlen("1234")  就是4了

19.在一个长为33厘米的光滑凹轨上,在第3厘米、第6厘米、第19厘米、第22 厘米、第26厘米处各有一个钢珠,凹轨很细,不能同时通过两个钢珠,开始时,钢珠运动方向是任意的。两个钢珠相撞后,以相同速度反向运动。假设所有钢珠初 始速度为每秒运动1厘米,那么所有钢珠离开凹轨的最长可能时间是()

A.30       B.26          C.38             D.33

解:A

解析:

所有球离开的最长时间,就可以等效为最后离开的那个球的时间,也就变成找哪个球离左边或右边出口的距离最远,显然5个球中,第一个球离右端出口(33-3)30是距离最远的。

20.下列说法错误的是()

A.已知一颗二叉树的前序遍历顺序和后序遍历顺序,可以唯一确定这棵二叉树

B.将一个递归算法改为非递归算法时,通常使用队列作为辅助结构

C.快速排序和堆排序都是不稳定排序

D.二分查找法,平均时间复杂度为O(n)

解:ABD

解析:

前序 中序 后序    这三个两两组合, 必须要有中序才能唯一确定一棵二叉树     前与后 不能唯一确定

递归算法改为非递归算法时,通常使用栈作为辅助结构(先进后出)

二分查找平均时间复杂度是O(logn),只有在最坏的情况下才是O(n)

 不稳定排序:堆、希尔、快、选

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值