数组专项训练—day1
-
数组元素的地址计算与数组的存储方式无关。请问这句话的说法是正确的吗?
错误。
-
以下叙述正确的是?(B)
A. 线性表的顺序存储结构优于链表存储结构。
B. 二维数组是其数据元素为线性表的线性表。
C. 栈的操作方式是先进先出。
D. 队列的操作方式是先进后出。解析: A. 顺序存储优点:存储密度大(=1),存储空间利用率高。 顺序存储缺点:插入或删除元素不方便。 链式存储优点:插入或删除元素效率高,方便、灵活。 链式存储缺点:存储密度小(<1),存储空间利用率低。 B. 二维数组是其数据元素为线性表的线性表。 线性表是最常用且最简单的一种数据结构,一个线性表是n个数据元素的有限集合。 C. 栈的操作方式是先进后出。 D. 队列的操作方式是先进先出。
-
在以下那个操作中,数组比链表更快?(D)
A. 原地逆序
B. 头部插入
C. 返回头节点
D. 返回随机节点 -
假设以数组data[0,…,m-1]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为:
(rear - front + m)% m。解析: 假设队尾指针是rear,队头是front,其中queuesize是循环队列的最大长度,则: (1)队空条件:rear == front (2)队满条件:(rear + 1)% queuesize == front (3)计算队列长度:(rear - front + queuesize)% queuesize (4)入队:(rear + 1)% queuesize (5)出队:(front + 1)% queuesize
-
执行一下代码段,会输出什么结果。(C)
A. 4
B. 5
C. 6
D. 7解析:sizeof()函数是计算开辟空间的大小,给数组a开辟的空间大小是6。strlen()是统计字符串长度,遇到'\0'结束,且不统计'\0',所以strlen(a)= 4,注意区分。
-
在一个长度为n的顺序表的任意位置插入一个新的元素的渐进时间复杂度为(A)。
A. o(n)
B. o(n / 2)
C. o(1)
D. o(n的平方)解析: 渐进时间复杂度指n趋于无穷时的复杂度。向序表中任意一个位置插入元素,插入位置之后的元素依次挪动一个位置,假设元素插入的位置坐标为k,则时间复杂度为O(k),渐进时间复杂度为O(n)。
-
线性表元素的个数n(n>=0)定义为线性表的长度。
-
设某数据结构的二元组形式表示为 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. 线性结构
B. 树型结构
C. 物理结构
D. 图型结构解析: 数据结构的二元组形式为:DS=(D,S) 其中 D 是数据元素的集合; S 是 D 中数据元素之间的关系集合,并且数据元素之间的关系是使用序偶来表示的。序偶是由两个元素 x 和 y 按一定顺序排列而成的二元组,记作<x , y>, x 是它的第一元素, y 是它的第二元素。 (1)如果 D != null,而S == null,则该数据结构为集合结构。 (2)如果 D = {01, 02, 03, 04, 05},S = {<02,04>, <03,05>, <05,02>, <01,03>},则该数据结构是线性结构。在这些数据元素中有一个可以被称为“第一个”的数据元素;还有一个可以被称为“最后一个”的数据元素;除第一个元素以外每个数据元素有且仅有一个直接前驱元素,除最后一个元素以外每个数据元素有且仅有一个直接后续元素。这种数据结构的特点是数据元素之间是 1对 1 的联系,即线性关系。 (3)D = {01, 02, 03, 04, 05, 06},S = {<01,02>, <01,03>, <02,04>, <02,05>, <03,06>}。除了一个数据元素(元素 01)以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后续元素。这种数据结构的特点是数据元素之间是 1 对 N 的联系,即树结构。 (4)D = {01, 02, 03, 04, 05},S = {<01,02>, <01,05>, <02,01>, <02,03>, <02,04>, <03,02>,<04,02>, <04,05>, <05,01>, <05,04>}。每个数据元素可以有多个直接前驱元素,也可以有多个直接后续元素。这种数据结构的特点是数据元素之间是 M 对 N 的联系,即图结构。
-
若 GetHead 【 GetTail 【 GetHead 【 ((a,b),(c,d)) 】】】 = A;, 则A为:(D)
A. (a,b)
B. ((a,b))
C. a
D. b解析: GetHead 【 ((a,b),(c,d)) 】返回第一个元素(a,b); GetTail (a,b) 返回除第一个元素外的子表(b); GetHead (b)返回第一个元素 b。
-
若数组A[0…m-1][0…n-1]按列优先顺序存储,则a[i][j]地址为(A )。
A. LOC(a00)+[ j * m + i ]。解析: 按列优先顺序存储,二维数组A[0…m-1][0…n-1]的任意一个元素A[i][j]的存储首地址LOC(i,j)=LOC(a00)+[m * (j-0)+(i-0)]*x,其中x代表每个元素占用的存储单元个数。
-
下列关于数组与指针的区别描述正确的是?
A. 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
B. 用运算符sizeof可以计算出数组的容量。(字节数)
C. 指针可以随时指向任意类型的内存块。
D. 用运算符ziseod可以计算出指针所指向内容的容量。解析: A. 堆上创建动态数组。 B. sizeof(数组名)=数组容量。 C. 指针常量,在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址,在定义的同时必须初始化。 D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是计算的指针的容量。
-
数组指针和指针数组有什么区别 ?
解析: 1.数组指针:定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 2.指针数组:定义 int *p[n]; []优先级高,先与p结合成为一个数组,再因为这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a[i] 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值。
-
下列关于线性表中的链表描述正确的是?(ABCD)
A. 适用于数据项数量不能预知的情况。
B. 逻辑相邻的2元素的存储空间可以是不连续的。
C. 链表节点一般有数据元素和指针域两部分组成。
D. 存储空间需要动态分配。 -
将数组 var a=[1,2,3] 变成数组 [4,3,2,1] 下面的方式正确的是?(AC)
A. a.reverse().unshift(4)
C. a.push(4);a.reverse()解析: (1)concat() 连接两个或多个数组 不改变原数组 返回被连接数组的一个副本 (2)join() 把数组中所有元素放入一个字符串 不改变原数组 返回字符串 (3)slice() 从已有的数组中返回选定的元素 不改变原数组 返回一个新数组 (4)toString() 把数组转为字符串 不改变原数组 返回数组的字符串形式 改变原数组: (5)pop() 删除数组最后一个元素,如果数组为空,则不改变数组,返回undefined 改变原数组 返回被删除的元素 (6)push() 向数组末尾添加一个或多个元素 改变原数组 返回新数组的长度 (7)reverse() 颠倒数组中元素的顺序 改变原数组 返回该数组 (8)shift() 把数组的第一个元素删除,若空数组,不进行任何操作,返回undefined 改变原数组 返回第一个元素的值 (9)sort() 对数组元素进行排序(ascii) 改变原数组 返回该数组 (10)splice() 从数组中添加/删除项目 改变原数组 返回被删除的元素 (11)unshift() 向数组的开头添加一个或多个元素 改变原数组 返回新数组的长度
-
Which statement declares a variable a which is suitable for referring to an array of 50 string objects?
下面哪个Java语句声明了一个适合于创建50个字符串对象数组的变量?(BCF)
A. char [][];
B. String a[];
C. String[] a;
D. Object a[50];
E. String a[50];
F. Object a[];解析: A:char[][] 定义了二位字符数组。在Java中,使用字符串对char数组赋值,必须使用toCharArray()方法进行转换。所以A错误。 B、C:在Java中定义String数组,有两种定义方式:String a[]和String[] a。所以B、C正确。 D、E:数组是一个引用类型变量 ,因此使用它定义一个变量时,仅仅定义了一个变量 ,这个引用变量还未指向任何有效的内存 ,因此定义数组不能指定数组的长度。所以D、E错误。 F:Object类是所有类的父类。子类其实是一种特殊的父类,因此子类对象可以直接赋值给父类引用变量,无须强制转换,这也被称为向上转型。这体现了多态的思想。所以F正确。