笔试强训day22

一、选择题

1、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
A 顺序表
B 双链表
C 带头结点的双循环链表
D 单循环链表
他的回答: D (错误)
正确答案: A
参考答案:
数组取、尾插、尾删元素O(1)
2、下列数据结构具有记忆功能的是?
A 队列
B 循环队列
C 栈
D 顺序表
他的回答: D (错误)
正确答案: C
3、循环两列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空,下列判断队空和队满的条件中,正确的是 ()
A 队空:end1end2; 队满:end1(end2+1)modM
B 队空:end1end2; 队满:end2(end1+1)mod(M-1)
C 队空:end2==(end1+1)modM ; 队满:end1==(end2+1)modM
D 队空:end1==(end2+1)modM; 队满:end2==(end1+1)mod(M-1)
他的回答: D (错误)
正确答案: A
参考答案:
数组长度就是M长度
对于循环队列来讲,要浪费一个空间用来判断队列是否已满
a.能存储的元素个数为M-1
b.最终判断是否已满mod M
队列是否为空
end1 == end2 为空
end1 == (end2 + 1) mod M
4、对递归程序的优化的一般的手段为()
A 尾递归优化
B 循环优化
C 堆栈优化
D 停止值优化
他的回答: D (错误)
正确答案: A
参考答案:
比如我们的快速排序和归并排序,在递归的终止条件 I是区间最左侧,r是区间最右侧// 终止条件(I >= r){ return;}

// 在递归终止条件处进行优化
// 当区间个数较小时,采用插入排序来优化(r -l<= 15) => 采用插入排序
5、将一颗有 100 个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根节点编号为 1 ,则编号为 98 的节点的父节点编号为()
A 47
B 48
C 49
D 50
他的回答: B (错误)
正确答案:C
参考答案:
根节点从1开始编号 根节点从0开始编号,在从1编号的基
设父节点编号为x 础上增加1个偏移量即可
left = 2x left = 2x + 1
right=2x + 1 right=2x+2 d
设现在孩子结点编号为n
父节点编号就是x/2 父节点(x-1)/2
6、将一棵二叉树的根结点放入队列,然后递归的执行如下操作,将出队结点所有子结点加入队。以上操作可以实现哪种遍历?
A 前序遍历
B 中序遍历
C 后序遍历
D 层序遍历
他的回答: A (错误)
正确答案:D
参考答案:
用到队列的遍历为层序遍历,前中后遍历借助的是栈
7、有 1000 个无序的整数,希望使用最快的方式找出前 50 个最大的,最佳的选择是( )
A 冒泡排序
B 基数排序
C 堆排序
D 快速排序
他的回答: C (正确)
正确答案: C
参考答案:
topk问题,在一组数据中找到k大个元素是利用堆或者优先级队列
8、以下数据结构说法,错误的是___?
A 红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
B B+树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
C Hash表插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(n)
D 排序链表插入操作的平均时间复杂度为O(n),最坏时间复杂度为O(n)
他的回答: D (错误)
正确答案: C
在这里插入图片描述
9、将两个各有n个元素的有序表归并成一个有序表,最少的比较次数是()
A 2n
B 2n-1
C n-1
D n
他的回答: B (错误)
正确答案: D
参考答案:
两个有序的子区间个数都为n,最好的情况为第二个区间都比第一个区间大,只需要比较n次即可
10、下列排序法中,每经过一次元素的交换会产生新的逆序的是( )
A 快速排序
B 冒泡排序
C 简单插入排序
D 简单选择排序
他的回答: B (错误)
正确答案: A
参考答案:
在数据元素的序列中,对于某个元素,如果其后存在一个元素小于它,则称之为存在一个逆序。冒泡排序只交换相邻元素,但不是每次移动都产生新的逆序。简单插入排序每一次比较后最多移掉一个逆序。快速排序每一次交换移动都会产生新的逆序,因为当不会有新的逆序产生时,本轮比较结束。简单选择排序的基本思想是先从所有 n 个待排序的数据元素中选择最小的元素,将该元素与第一个元素交换,再从剩下的 n-1 个元素中选出最小的元素与第 2 个元素交换,这样做不会产生逆序。故本题答案为 A 选项。

二、编程题

【小易的升级之路】
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
输入描述:
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值.
然后输入n行,每行整数,b1,b2…bn(1≤bi≤n)表示每个怪物的防御力
输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
示例1:
输入
3 50
50 105 200
5 20
30 20 15 40 100
输出
110
205
【解题思路】:
本题的能力值的累加分两种情况,一种是直接相加bi,一种是累加当前能力值于bi的最大公约数。最大公约数可以通过碾转相除法求得:a与b的最大公约数相当于b与a,b余数的最大公约数。如果求余结果为0, 则b为所求结果

牛客网ACM模式代码

import java.util.*;
import java.io.*;
public class Main {
    public static int func(int a,int b){
        int c=0;
        while((c=a%b)!=0){
            a=b;
            b=c;
        }
        return b;
    }
    public static void main(String[] args) throws Exception{
        //循环读入
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String s;
        while((s=reader.readLine())!=null){
            String[] arr=s.split(" ");
            int num = Integer.parseInt(arr[0]);
            int c = Integer.parseInt(arr[1]);
            //读入boss的防御值
            for(int i=0;i<num;i++){
                int power=Integer.parseInt(reader.readLine());
                if(c>=power){
                    c+=power;
                }else{
                    c+=func(c,power);
                }
            }
             System.out.println(c);
        }
    }
}

【找出字符串中第一个只出现一次的字符】
找出字符串中第一个只出现一次的字符
数据范围:输入的字符串长度满足1<=n<=1000
输入描述:
输入一个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出-1
示例1:
输入
asdfasdfo
输出
o
【解题思路】:
用一个数组的每一个位置表示对应的位置。对应的字符位置存放字符出现的次数。统计完之后,遍历输入字符,遇到第一个只出现一次的字符就停止

import java.util.*;
import java.io.*;
public class Main {
    public static void findFirst(String str){
        char[] arr=str.toCharArray();
        int[] count=new int[128];
        for(int i=0;i<arr.length;i++){
            count[arr[i]]++;
        }
        boolean flag=false;
        for(int i=0;i<arr.length;i++){
            if(count[arr[i]]==1){
                System.out.println(arr[i]);
                flag=true;
                break;
            }
        }
            if(!flag){
                System.out.println(-1); 
            }
        
    } 
    public static void main(String[] args) throws Exception{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String s;
        while((s=reader.readLine())!=null){
            findFirst(s);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值