数据结构题

选择题
1.以下叙述中正确的是(B)
A .线性表的线性存储结构优于链表存储结构
B.二维数组是它的每个数据元素为一个线性表的线性表
C.栈的操作方式是先进先出
D.队列的操作方式先进后出

解析:

A:线性表查找复杂度为O(1),添加删除元素复杂度为O(n),而链表查找复杂度为O(n),添加删除元素时空复杂度为O(1),因此不能比较。
C:栈先进后出
D:队列是先进先出

2.线性表采用链式存储时,其地址__D______。
A.必须是连续的
B.一定是不连续的
C.部分地址必须是连续的
D.连续与否均可以
3.若二维数组 a 有 m 列,则在数组元素 a[i][j] 前的元素个数为(B )
A. j * m + i
B.i * m + j
C.i * m + j - 1
D.j * m + i - 1

4.用向量和单链表示的有序表均可使用折半查找方法来提高查找速度(B)
A.对
B.错

折半查找属于随机访问特性 链表不行

5.若某线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?A
A.顺序表
B. 双链表
C.带头结点的双循环链表
D. 单循环链表

线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算; 进行任意位置存取,这个最省时省力的就是数组了,也就是顺序表

6.下列说法错误的有(bcd)
A. 数组是一种对象
B. 数组属于一种原生类
C. int number=[]={31,23,33,43,35,63}
D. 数组的大小可以任意改变

a、数组是能被Object 一切能被Obj 接收的均为对象; b、数组不是原生类 原生类有8种, int double boolean
float byte short long char ; c、语法错误、 d、数组的大小一开始就已经确定了 int[]test=new
test[2];

初始化数组 int [] arr = {2,10,23,31,55,86},使用二分查询算法查找55,需要循环执行多少次才能命中目标?B
A.1
B.2
C.3
D.4

解析:二分查找,查找数组取中间得那个数;6/2=3;第一次查找到第3个数,23;
55比23大,第2次在31,55,86中取中间55,正是;所以查找了2次。

设数组a[]作为循环队列SQ的存储空间,数组的长度为m,f为队头指示,r为队尾指示则执行出队操作的语句为-B
A. f=f+1
B.f=(f+1)%m
C.r=(r+1)%m
D.f=(f+1)%(m+1)

静态链表是用数组存储节点数据,模拟链表的实现,但是没有用到指针。每个数组节点包括两部分:data域和cursor(游标)域。data存储数据,cursor指明下个元素在数组中的下标。
(1)存取第i个元素时,需要从头遍历到i-1和元素,由第i-1个节点的cursor,才能知道第i个元素存储的位置,因此和i是相关的。
(2)使用数组对元素进行存储,在定义时大小已经确定。
(3)插入和删除操作无需移动元素,只需要修改cursor游标的值即可,就像修改动态链表中的指针一样。

9.以下关于链表和数组说法正确的是(ABC)
A. 数组从栈中分配空间,链表从堆中分配空间
B.数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)
C.数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n)
D.对于add和remove,ArrayList要比LinkedList快

解析:ArrayList的底层是数组所以查看快,LinkedList是链式存储结构所以增删快

若用一个大小为 6 的数组来实现循环队列,且当 rear 和 front 的值分别为 0 和 3 。当从队列中删除一个元素,再加入两个元素后, rear 和 front 的值分别为 。B

A.1和5
B.2和4
C.4和2
D.5和1

1、队列添加元素是在对尾,删除元素是在对头;
2、添加元素,尾指针rear+1;删除元素,头指针front+1;
3、本题中,删除一个元素,front+1,也就是3+1=4;添加2个元素,rear+2,也就是0+2=2;

11.一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,这个序列的初始值从1开始,但是1并不在这个数列中。求第1500个值是多少?C
A. 2040
B.2042
C.2045
D.2050

设x个数,x/2+x/3+x/5-x/6-x/10-x/15+x/30=1500

以下多维数组声明语句中,不正确的有( B)。

A. int[,]a = new int[2,3];
B.int[,] a = {{1,2,3}};
C.int[2,3] a = new int[2,3];
D.int[,] a = {{1,2,3},{2,3}}

大题
1.给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2

解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

/**
* 根据例子可知假设 num = 384 = 3 * 100 + 8 * 10 + 4
* 第一轮计算 sum = 15 = 3 + 8 + 4
* 差值 = 3 * 99 + 8 * 9 = (3 * 11 + 8) * 9 即差值为9的倍数
* 第二轮计算 num = 15 = 1 * 10 + 5
* sum = 6 = 1 * 0 + 5
* 差值 = 9
* 由此得出规律:num % 9
* 注意:需要注意 9 的整倍数最终结果应该返回9,小于10的数直接返回
*

public static int addDigits3(int num) {
    if (num < 10) {
        return  num;
    }
    int res = num % 9;
    if (res == 0) {
        return 9;
    }
    return res;
}

2.给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

class Solution {
    public int search(int[] nums, int target) {
   		 int begin = 0;
        int end = nums.length;
        int half = (begin+end)/2;
        while(begin<end){
             if(nums[half]<target){
                 begin = half;
             }else if(nums[half]>target){
                 end = half;
            }else if(nums[half]==target){
                 return half;
             }
            if((half)==(begin+end)/2){
                return -1;
            }else {
                half=(begin+end)/2;
            }
            
        }
        return -1;      
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值