当前位置: 首页 > article >正文

【Java笔试强训 21】

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

欢迎志同道合的朋友一起加油喔🤺🤺🤺


 目录

一、选择题

二、编程题

   🔥 洗牌

   🔥MP3光标位置 



一、选择题

1、设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度()
A O(log2n)
B O(1)
C O(n2)
D O(n)
正确答案: D
2、一个栈的初始状态为空。首先将元素5,4,3,2,1 依次入栈,然后退栈一次,再将元素A,B,C,D依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为?
A 1DCAB2345
B 1DCBA2345
C 54321ABCD
D DCBA12345
正确答案: B
3、设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5,e6依次压入栈S,一个元素出栈后即进入队列Q,若出队列的顺序为e2,e4,e3,e6,e5,e1则栈S的容量要求最小值为
A 2
B 3
C 4
D 5
正确答案: B
4、给定下列程序,那么执行printf(“%d\n”, foo(20, 13));的输出结果是________。

int foo(int x, int y){
if (x <= 0 || y <= 0)
return 1;
return 3 * foo( x-6, y/2 );
}

A 3
B 9
C 27
D 81
正确答案: D
参考答案:
解析:foo(20, 13) = 3 * foo(14, 6) = 3 * 3 * foo(8, 3) = 3 * 3 * 3 * foo(2, 1) = 3 * 3 * 3 * 3 * foo(-4, 0) =3 * 3 * 3 * 3 * 1 = 81
答案:D
5、在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2
正确答案: A
参考答案:
完全二叉树是指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干结点。根据完全二叉树性质,如果共 2n 个结点,从根结点开始按层序用自然数 1 , 2 ,…, 2n 给结点编号,则编号为 n 的结点左子结点编号为 2n ,因此叶子结点编号为 n+1,n+2, … ,2n 。故叶子结点个数为 n ,本题
答案为 A 选项。
6、下列叙述中错误的是( )
A 二叉链表是二叉树的存储结构
B 循环链表是循环队列的存储结构
C 栈是线性结构
D 循环队列是队列的存储结构
正确答案: B
参考答案:
循环队列是队列的一种顺序存储结构,用队尾指针 rear 指向队列中的队尾元素,用排头指针 front 指向排头元素的前一个位置。循环链表是用不连续的存储单元存储数据,它有一个表头结点,队头指针指向表头结点,最后一个结点的指针域指向表头结点。二叉链表是树的二叉链表实现方式。栈是一种特殊存取方式的线性表。故本题答案为 B 选项。
7、下述二叉树中,哪一种满足性质:从任一结点出发到根的路径上所经过的结点序列按其关键字有序()
A 二叉排序树
B 哈夫曼树
C AVL树
D 堆
正确答案: D
8、为提高散列(Hash)表的查找效率,可以采取的正确措施是( )。
Ⅰ.增大装填(载)因子
Ⅱ.设计冲突(碰撞)少的散列函数
Ⅲ.处理冲突(碰撞)时避免产生聚集(堆积)现象
A 仅Ⅰ
B 仅Ⅱ
C 仅Ⅰ、 Ⅱ
D 仅Ⅱ、 Ⅲ
正确答案: D
9、将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是_____。
A 2-6-3-5-4-1-7
B 6-2-3-5-4-1-7
C 6-5-3-2-4-1-7
D 1-5-3-2-4-6-7
E 5-4-3-2-1-6-7
F 5-1-3-2-4-6-7
正确答案: C
10、下列各排序法中,最坏情况下的时间复杂度最低的是( )
A 希尔排序
B 快速排序
C 堆排序
D 冒泡排序
正确答案: C
参考答案:
堆排序最坏情况时间下的时间复杂度为 O(nlog2n) ;希尔排序最坏情况时间下的时间复杂度为 O(n1.5) ;快速排序、冒泡排序最坏情况时间下的时间复杂度为O(n2) 。故本题答案为 C 选项。


二、编程题

     🔥 洗牌

    洗牌_牛客题霸_牛客网

 【解题思路】:
每次读取一个数之后,算出他经过k次洗牌后的位置,只用一个长度为2n数组用来输出
根据当前数的位置,可以算出经过一次洗牌后的位置
如果当前数小于等于n(即在左手),则他下次出现的位置是 2当前位置
与之对应的当前位置 + n(即在右手)的牌,则他下次出现的位置是 2当前位置 + 1

import java.util.*;
public class Main{
    public static void playCard(int[] cards, int n, int k){
        // i --> 2 * i
         // i + n ---> 2 * i + 1
        for(int i = 0; i < k; ++i){
             //一次洗牌的过程
            int[] newCards = new int[cards.length];
            //遍历编号为 0 ~ n - 1
                for(int j = 0; j < n; ++j){
                        newCards[2 * j] = cards[j];
                        newCards[2 * j + 1] = cards[j + n];
                }
            cards = newCards;
        }
        //从上往下打印
        printCard(cards);
    }
    public static void printCard(int[] cards){
        for(int i = 0; i < cards.length - 1; ++i){
            System.out.print(cards[i] + " ");
        }
        System.out.println(cards[cards.length - 1]);
    }
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        int groups = s.nextInt();
        for(int i = 0;i < groups; ++i){
            //读入每组数据
            int n = s.nextInt();
            int k = s.nextInt();
            int[] cards = new int[2 * n];
            for(int j = 0; j < 2 * n; ++j){
                cards[j] = s.nextInt();
            }
            //洗牌
            playCard(cards, n, k);
        }
    }
}

🔥MP3光标位置 

MP3光标位置_牛客题霸_牛客网

 【解题思路】:
本题比较简单,通过解析指令,进行移动即可,分两种情况,歌曲数目不大于4和大于4的情况。

import java.util.*;
import java.io.*;
public class Main{
    public static void mouseMove(String numStr, String orderStr){
        //歌曲数量
        int n = Integer.parseInt(numStr);
        //指令数组: UD
        char[] order = orderStr.toCharArray();
        //当前鼠标所在的位置
        int mouse = 1;
        //显示列表所在的起始位置
        int first = 1;
        //指令处理
        //n <=4
        if(n <= 4){
            //循环处理每一个指令
            for(int i = 0; i < order.length; ++i){
                //光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲
                if(mouse == 1 && order[i] == 'U')
                    mouse = n;
                //光标在最后一首歌曲时,按Down键光标挪到第一首歌曲
                else if(mouse == n && order[i] == 'D')
                        mouse = 1;
                //其他情况下用户按Up键,光标挪到上一首歌曲
                else if(order[i] == 'U')
                        --mouse;
                //用户按Down键,光标挪到下一首歌曲
                else if(order[i] == 'D')
                        ++mouse;
                }
                //输出
                //打印当前的显示列表
                for(int i = 1; i < n; ++i)
                    System.out.print(i + " ");
                    System.out.println(n);
                    //打印当前歌曲
                    System.out.println(mouse);
                }else{
                     //n > 4
                    for(int i = 0; i < order.length; ++i){
                    //屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,
                    //用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),
                    //同时光标放到最后一首歌上。
                        if(first == 1 && mouse == 1 && order[i] == 'U'){
                            //最右一页的起始位置
                            first = n - 3;
                            mouse = n;
                        }
                        //同样的,屏幕显示最后一页时,光标在最后一首歌曲上,
                        //用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。
                        else if(first == n - 3 && mouse == n && order[i] == 'D'){
                                first = 1;
                                mouse = 1;
                        }
                        //屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,
                        //屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。
                        else if(first != 1 && mouse == first && order[i] == 'U'){
                                    --mouse;
                                    --first;
                        }
                        //屏幕显示的不是第一页时,光标在当前屏幕的最后一首歌时的
                        //按Down键,屏幕从当前歌曲的下一首开始显示,光标也挪到下一首歌曲
                        else if(first != n - 3 && mouse == first + 3 && order[i] == 'D'){
                                    first++;
                                    mouse++;
                        }
                        //其它情况,只移动光标
                        else if(order[i] == 'U')
                                --mouse;
                        else if(order[i] == 'D')
                                ++mouse;
                        }
                        //输出
                        //打印当前的显示列表
                        for(int i = first; i < first + 3; ++i)
                                System.out.print(i + " ");
                                System.out.println(first + 3);
                                //打印当前歌曲
                                System.out.println(mouse);
            }
     }
    public static void main(String[] args) throws Exception{
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String numStr;
            while((numStr = reader.readLine()) != null){
                String orderStr = reader.readLine();
                mouseMove(numStr, orderStr);
            }
    }
}


http://www.kler.cn/a/16930.html

相关文章:

  • 01:(手撸HAL+CubeMX)时钟篇
  • 测试工程师简历「精选篇」
  • C++ 并发专题 - 自旋锁的实现(Spinlock)
  • 【go从零单排】JSON序列化和反序列化
  • kafka面试题解答(四)
  • 若依笔记(八):芋道的Docker容器化部署
  • 10. hr 综合面试题汇总
  • JavaScript (二) -- 基础语法
  • 测牛学堂:2023软件测试入门学习指南(测试理论之测试方法的分类总结)
  • Packet Tracer - 配置 RIPv2
  • 少年不懂孔乙己,读懂已是书中人
  • DGIOT智慧农业案例分享
  • 01-Flink Metrics简介
  • Compiler Lab1- 自制词法分析器
  • 【ROS 开发神器 Visual Studio Code 的安装和设置】
  • 理解Hopcroft DFA最小化算法
  • 教育专题讲座(没有答案)
  • ImageJ实践——拟合矩形选区探究(bounding rectangle),左侧优先法则
  • 出道的第八年,依然AI着......
  • Python每日一练(20230505) 课程表 Course Schedule III/IV
  • Java 中的集合框架有哪些?(十四)
  • Leetcode刷题日志2.0
  • 【QT】 Qt高级——Qt自定义标题栏
  • 为什么说网络安全行业是IT行业最后的红利?
  • 【计算机是怎么跑起来的】基础:计算机三大原则
  • 前端架构师-week4-Node多进程开发入门