数据结构之数组——每日一练

数组专项训练—day1

  1. 数组元素的地址计算与数组的存储方式无关。请问这句话的说法是正确的吗?
    错误。
    在这里插入图片描述

  2. 以下叙述正确的是?(B)
    A. 线性表的顺序存储结构优于链表存储结构。
    B. 二维数组是其数据元素为线性表的线性表。
    C. 栈的操作方式是先进先出。
    D. 队列的操作方式是先进后出。

     解析:
     A. 顺序存储优点:存储密度大(=1),存储空间利用率高。
         顺序存储缺点:插入或删除元素不方便。
         链式存储优点:插入或删除元素效率高,方便、灵活。
         链式存储缺点:存储密度小(<1),存储空间利用率低。
     B. 二维数组是其数据元素为线性表的线性表。
        线性表是最常用且最简单的一种数据结构,一个线性表是n个数据元素的有限集合。
     C. 栈的操作方式是先进后出。
     D.  队列的操作方式是先进先出。
    
  3. 在以下那个操作中,数组比链表更快?(D)
    A. 原地逆序
    B. 头部插入
    C. 返回头节点
    D. 返回随机节点

  4. 假设以数组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
    
  5. 执行一下代码段,会输出什么结果。(C)
    在这里插入图片描述
    A. 4
    B. 5
    C. 6
    D. 7

     解析:sizeof()函数是计算开辟空间的大小,给数组a开辟的空间大小是6。strlen()是统计字符串长度,遇到'\0'结束,且不统计'\0',所以strlen(a)= 4,注意区分。
    
  6. 在一个长度为n的顺序表的任意位置插入一个新的元素的渐进时间复杂度为(A)。
    A. o(n)
    B. o(n / 2)
    C. o(1)
    D. o(n的平方)

     解析:
     渐进时间复杂度指n趋于无穷时的复杂度。向序表中任意一个位置插入元素,插入位置之后的元素依次挪动一个位置,假设元素插入的位置坐标为k,则时间复杂度为O(k),渐进时间复杂度为O(n)。
    
  7. 线性表元素的个数n(n>=0)定义为线性表的长度。

  8. 设某数据结构的二元组形式表示为 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 的联系,即图结构。
    
  9. 若 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。
    
  10. 若数组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代表每个元素占用的存储单元个数。
    
  11. 下列关于数组与指针的区别描述正确的是?
    A. 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
    B. 用运算符sizeof可以计算出数组的容量。(字节数)
    C. 指针可以随时指向任意类型的内存块。
    D. 用运算符ziseod可以计算出指针所指向内容的容量。

    解析:
    A. 堆上创建动态数组。
    B. sizeof(数组名)=数组容量。
    C. 指针常量,在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址,在定义的同时必须初始化。
    D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是计算的指针的容量。
    
  12. 数组指针和指针数组有什么区别 ?

    解析:
    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],所以要分别赋值。
    
  13. 下列关于线性表中的链表描述正确的是?(ABCD)
    A. 适用于数据项数量不能预知的情况。
    B. 逻辑相邻的2元素的存储空间可以是不连续的。
    C. 链表节点一般有数据元素和指针域两部分组成。
    D. 存储空间需要动态分配。

  14. 将数组 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()
    		向数组的开头添加一个或多个元素
    		改变原数组
    		返回新数组的长度
    
  15. 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正确。
    
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值