笔试强训(二十一)

一、选择题

(1)下列叙述错误的是(B)
A.二叉链表是二叉树的存储结构
B.循环链表是循环队列的存储结构
C.栈是线性结构
D.循环队列是队列的存储结构

循环队列的存储结构是数组

(2)下述二叉树中,哪一种满足性质:从任意节点出发到根的路径上所经过的节点序列按其关键字有序(D)
A.二叉排序树
B.哈夫曼树
C.AVL树
D.堆

AVL树是平衡二叉排序树(二叉搜索树)
哈夫曼树是带权值的树,与元素大小顺序无关
在这里插入图片描述
堆是满足题目要求的,在堆中的所有节点都满足根节点大于(或小于)左右孩子

(3)为提高散列(Hash)表的查找效率,可以采取的措施是(D)

  1. 增大装载因子
  2. 设计冲突少的散列函数
  3. 处理冲突时避免产生聚集现象
    A.1
    B.2
    C.1,2
    D.2,3

增大装载因子,会增加冲突概率,查找效率变慢

(4)下列排序算法中,最坏情况下的时间复杂度最低的是(C)
A.希尔排序
B.快速排序
C.堆排序
D.冒泡排序

希尔排序最坏情况下的时间复杂度为O(N^2)
快速排序,当出现大量重复元素或数组几乎有序的时候,递归退化成链表,时间复杂度O(N^2)
堆排序的时间复杂度始终是O(N*logN)
冒泡排序的时间复杂度O(N^2)

二、编程题

2.1 MP3光标位置

2.1.1 题目

在这里插入图片描述

2.1.2 题解

思路:按照题目给出的翻页要求转化成代码即可
当歌曲数目小于4的情况比较简单,我们主要讨论一下当歌曲数目大于四的情况
使用变量mouse保存光标位置,begin保存光标所在页的起始位置
初始情况mouse=1,begin=1

(1)屏幕显示的是第一页时,光标显示的第一首歌曲时,也就是mouse=1,begin=1时,如果当前命令为U,此时需要将光标移动到最后一首歌,并将begin移动到最后一首歌所在页的第一首歌的位置
mouse=n;
begin=n-3;
(2)屏幕显示的是最后一页时,光标显示的最后一首歌曲时,也就是当mouse=n,如果当前命令是D,需要将光标移动到第一首歌,并将begin也移动到第一首歌
mouse=1;
begin=1;
(3)屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,也就是begin==mouse的情况,且用户按Up键后
begin–;
mouse–;
(4)屏幕显示的不是第一页时,光标在当前屏幕显示的最后一首歌曲时,也就是begin+3 == mouse的情况,且用户按Down键后
mouse++;
beign++;
(5)其他情况根据命令,移动光标位置即可,beign位置不用移动

【注意】:
要先判断(1)和(2)的情况,后判断(3)和(4) 的情况,最后判断(5)
代码:

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String str = scanner.next();
        int mouse = 1;
        int begin = 1;
        if (n < 4) {
            for (int i = 0; i < str.length(); i++) {
                if (mouse == 1 && str.charAt(i) == 'U') {
                    mouse = n;
                } else if (mouse == n && str.charAt(i) == 'D') {
                    mouse = 1;
                } else if (str.charAt(i) == 'U') {
                    mouse--;

                } else if (str.charAt(i) == 'D') {
                    mouse++;
                }
            }
            for (int i = 1; i <= n; i++) {
                System.out.print(i + " ");
            }
            System.out.println();
            System.out.println(mouse);
        } else {

            for (int i = 0; i < str.length(); i++) {
                if (begin == 1 && mouse == 1 &&  str.charAt(i) == 'U') {
                    mouse = n;
                    begin = n - 3;
                } else if (mouse == n && str.charAt(i) == 'D') {
                    begin = 1;
                    mouse = 1;
                } else if ( begin == mouse && str.charAt(i) == 'U') {
                    begin--;
                    mouse--;
                } else if (begin + 3 == mouse && str.charAt(i) == 'D') {
                    mouse++;
                    begin++;
                } else if (str.charAt(i) == 'U') {
                    mouse--;
                } else if (str.charAt(i) == 'D') {
                    mouse++;
                }
            }

            System.out.println(begin + " " + (begin + 1) + " " + (begin + 2) + " " +
                               (begin + 3));
            System.out.println(mouse);
        }
    }

2.2 洗牌

2.2.1 题目

在这里插入图片描述

2.2.2 题解

思路

在这里插入图片描述

代码:

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner  scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        while (m > 0) {
            int n = scanner.nextInt();
            int k = scanner.nextInt();
            int[] arr=new int[2*n];
            for(int i=0;i<2*n;i++){
                int pos=i;
                for(int j=0;j<k;j++){
                    if(pos<n){
                    pos=2*pos;
                    }else {
                     pos=2*(pos-n)+1;
                    }
                }
                arr[pos]=scanner.nextInt();
            }
            for(int i=0;i<2*n;i++){
                System.out.print(arr[i]+" ");
            }
            System.out.println();
            m--;
        }
    }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值