刷题日记【第十二篇】-笔试必刷题【洗牌+MP3光标位置+年终奖+迷宫问题】

洗牌【编程题】

在这里插入图片描述

import java.util.*;

public class Main {
    // 左: i -->  2*i;
    // 右: i+n --> 2*i + 1;
    private static void playCard(int[] cards, int n, int k ) {
        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);
    }
    private 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 scan = new Scanner(System.in);
        int group = scan.nextInt();
        for (int i = 0; i < group; i++) {
            //读入每组数据
            int n = scan.nextInt();
            int k = scan.nextInt();
            int[] arr = new int[2 * n];
            for (int j = 0; j < 2 * n; j++) {
                arr[j] = scan.nextInt();
            }
            //洗牌
            playCard(arr, n, k);
        }
    }
}

MP3光标位置【编程题】

在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;
import java.io.*;
 
public class Main {
    private 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++) {
                if(mouse == 1 && order[i] == 'U') {
                    mouse = n;
                }else if(mouse == n && order[i] == 'D') {
                    mouse = 1;
                }else if(order[i] == 'U') {
                    mouse--;
                }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++) {
                if(first == 1 && mouse == 1 && order[i] == 'U') {
                    first = n-3;
                    mouse = n;
                }else if (first == n-3 && mouse == n && order[i] == 'D') {
                    first = 1;
                    mouse = 1;
                }else if (first != 1 && mouse == first && order[i] == 'U') {
                    first--;
                    mouse--;
                    //屏幕显示的不是第一页时,光标在当前屏幕最后一首歌时,按Down键显示下一首歌,这里要注意,如果是最后一页的话,按D就会到第一首歌
                }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 br = new BufferedReader(new InputStreamReader(System.in));
        String numStr;
        while((numStr = br.readLine()) != null) {
            String orderStr = br.readLine();
            mouseMove(numStr,orderStr);
        }
    }
}

年终奖【编程题】

在这里插入图片描述

    public int getMost(int[][] board) {
        int row = board.length;
        int col = board[0].length;
        //第一行 和第一列
        for (int i = 1; i < col; i++) {
            board[0][i] += board[0][i-1];
        }
        for (int i = 1; i < row; i++) {
            board[i][0] += board[i-1][0];
        }
        //处理剩余位置
        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                board[i][j] += Math.max(board[i-1][j],board[i][j-1]);
            }
        }
        return board[row-1][col-1];
    }

迷宫问题【编程题】

在这里插入图片描述

import java.util.*;
 
 
class Node {
    int x;
    int y;
    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int row = scan.nextInt();
        int col = scan.nextInt();
        //创建迷宫
        int[][] mat = new int[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                mat[i][j] = scan.nextInt();
            }
        }   
        //搜索路径
        ArrayList<Node> path = new ArrayList<>();
        ArrayList<Node> minPath = new ArrayList<>();
        int[][] book = new int[row][col];
        getMinPath(mat,row,col,0,0,book,path,minPath);
        
        //打印路径
        for(Node n : minPath) {
            System.out.println("(" + n.x + ',' + n.y + ")");
        }
    }
 
    //matL迷宫矩阵: row行 row列
    // x,y:当前位置
    // book:标记矩阵,标记当前位置是否走过
    // path:保存当前路径的每一个位置
    // minPath:保存最短路径
    private static void getMinPath(int[][] mat, int row, int col, int x, int y, int[][] book, ArrayList<Node> path, ArrayList<Node> minPath) {
        // 判断(x,y):是否越界,是否走过,是否有障碍
        if(x < 0 || x >= row || y < 0 || y >= col || book[x][y] == 1 || mat[x][y] == 1) {
            return;
        }
        //把当前位置存入路径中
        path.add(new Node(x,y));
        //标记当前位置
        book[x][y] = 1;
        //判断当前位置是否为出口
        if(x == row-1 && y == col-1) {
            //一条新的路径产生了
            //判断是否为更短路径
            if(minPath.isEmpty() || path.size() < minPath.size()) {
                //更新为更短路径
                minPath.clear();
                for(Node n : path) {
                    minPath.add(n);
                }
            }
        }
        //如果不是出口,继续搜索(x,y)的上下左右四个方向
        getMinPath(mat,row,col,x+1,y,book,path,minPath);//下
        getMinPath(mat,row,col,x-1,y,book,path,minPath);//上
        getMinPath(mat,row,col,x,y+1,book,path,minPath);//右
        getMinPath(mat,row,col,x,y-1,book,path,minPath);//左
        //把当前位置从路径中删除,寻找新的路径
        path.remove(path.size()-1);
        book[x][y] = 0;//回退了,表示没有走过,改为0
    }
}

1. 堆是从任意结点出发到根路径上所经过的结点序列按其关键字有序【大根堆/小根堆】

在这里插入图片描述
A:二叉排序树(BST):

  • 如果左子树不空,那么左子树上所有结点的值均小于根结点。
  • 如果右子树不空,那么右子树上所有结点的1值均大于根结点。

B:哈夫曼树:

  • 带权值的树

C:AVL树:【平衡二叉查找树】

  • 树中任意结点的两个子树高度最大差为1,那么这棵树就是高度平衡树

D:堆:

  • 分为大根堆-小根堆
  • 如果是大根堆(小根堆),堆中所有结点都满足:根结点大于(小于)左右孩子结点。
    由四个选项的特点可以看出,二叉排序树只在根结点处有序,其余子节点无序,所以pass A选项;哈夫曼树是无序的;AVL树也是无序的;只有D选项属于根结点有序,子节点有序,所以选择D。

2.将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是(C)

在这里插入图片描述
在这里插入图片描述

3.排序方法的最坏时间复杂度

堆排序最坏情况时间下的时间复杂度为 O(nlog2n) ;

希尔排序最坏情况时间下的时间复杂度为 O(n1.5) ;

快速排序、冒泡排序最坏情况时间下的时间复杂度为O(n2) 。

4.HASH 函数冲突处理方式

A 开放定址法
B 链地址法
C 插入排序法

5.二叉排序树特点

B)二叉排序树可以得到一个从小到大的有序序列。
A 先序遍历
B 中序遍历
C 后序遍
D 层次遍历
  • 二叉排序树(BST):

  • 如果左子树不空,那么左子树上所有结点的值均小于根结点。

  • 如果右子树不空,那么右子树上所有结点的1值均大于根结点。

可以看出二叉排序树属于 左小右大,所以中序遍历就可以完成从小到大的有序序列

6.快排确定第几趟排序结果,要看有几个数满足左边大右边小的条件

在这里插入图片描述
在这里插入图片描述

7.堆排序平均执行的时间复杂度和需要附加的存储空间复杂度分别是(B)

A O(N2)O(1)
B O(Nlog2N)O(1)
C O(Nlog2N)O(N)
D O(N2)O(N)

在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙宇航_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值