【Java版oj】day24洗牌、MP3光标位置

news2025/6/16 8:26:59

目录

 一、洗牌

(1)原题再现

(2)问题分析

(3)完整代码

 二、MP3光标位置

(1)原题再现

(2)问题分析

(3)完整代码


 一、洗牌

(1)原题再现

洗牌_网易有道笔试题_牛客网

        洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。 例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,左手拿着1,2,3;右手拿着4,5,6。在洗牌过程中按顺序放下了6,3,5,2,4,1。把这六张牌再次合成一组牌之后,我们按照从上往下的顺序看这组牌,就变成了序列1,4,2,5,3,6。 现在给出一个原始牌组,请输出这副牌洗牌k次之后从上往下的序列。

 

输入描述:

        第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来有2n行个数a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌组从上到下的序列。

输出描述:

        对于每组数据,输出一行,最终的序列。数字之间用空格隔开,不要在行末输出多余的空格。

示例1

3

3 1

1

2

3

4

5

6

3 2

1

2

3

4

5

6

2 2

1

1

1

1

输出

1 4 2 5 3 6

1 5 4 3 2 6

1 1 1 1

(2)问题分析

        本题重要的是先把一次洗牌的结果找出,根据要求k为几,就用for循环几次。

        一次洗牌的步骤:首先把所有牌分成两部分,用两个数组保存。第一幅牌数组下标是从0到所有牌的一半(len/2),第二副牌数组下标是从len/2到len。然后定义一个结果数组,用来存放洗完牌后的结果,根据题目要求,其实就是把第一副牌放在第一个位置,第二副牌放到第二个位置,一次交叉。因为结果数组下标是从0开始的,所以下标能整除2的地方就用来存放第一副牌,不能整除的存放第二副牌。注意:i等于1的时候表示,第二副牌中的第一张牌(位置下标为0)存放在结果数组的第二个位置(位置下标是1)。

(3)完整代码

import java.util.Scanner;

/*
 * 洗牌
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int times = sc.nextInt();
        while (times-- > 0) {
            int n = sc.nextInt();
            int k = sc.nextInt();
            int []cards = new int [2 * n];
            for (int i = 0; i < 2 * n; i++) {
                cards[i] = sc.nextInt();
            }
            for (int i = 0; i < k; i++) {
                cards = shuffleOneCard(cards);
            }
            for (int i = 0; i < 2 * n; i++) {
                if (i == 2 * n - 1) {
                    System.out.println(cards[i]);
                    break;
                }
                System.out.print(cards[i] + " ");
            }
        }
    }
    public static int[]shuffleOneCard(int[]cards) {
        int len = cards.length;
        int []oneCards = new int [len / 2];
        int []twoCards = new int [len / 2];
        int []res = new int [len];
        for (int i = 0; i < len / 2; i++) {
            oneCards[i] = cards[i];
        }
        for (int i = 0; i < len / 2; i++) {
            twoCards[i] = cards[i + len / 2];
        }
        for (int i = 0; i < len; i++) {
            if (i % 2 == 0) {
                res[i] = oneCards[i / 2];
            } else {
                res[i] = twoCards[(i - 1) / 2];
            }
        }
        return res;
    }
}

 二、MP3光标位置

(1)原题再现

MP3光标位置__牛客网
来源:牛客网
 

        MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。

        现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:

  1. 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。

光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。

其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。

2. 歌曲总数大于4的时候(以一共有10首歌为例):

特殊翻页:屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。

一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。

其他情况,不用翻页,只是挪动光标就行。

输入描述:

输入说明:
1 输入歌曲数量
2 输入命令 U或者D

 

输出描述:

输出说明
1 输出当前列表
2 输出当前选中歌曲

示例1

输入

10

UUUU

输出

7 8 9 10

7

(2)问题分析

        这道题看似很长很复杂,其实只要根据题目要求,分情况把所有可能的结果列举出来就行了。

分情况:

1.歌曲总数1小于等于4

2.歌曲总数大于4------>特殊翻页-------->从一页往上翻页跳到最后一页

                            |                         |----->从一页往上翻页跳到最后一页

                            |---->普通翻页-------->往上翻页

                                                     |----->往下翻页

                                                     |----->不用翻页

        因为需要输出每页上的所有歌曲,所以需要start变量记录每页第一个歌曲的位置,index表示光标的位置。

(3)完整代码

import java.util.*;
/*
 * MP3光标位置
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String str = sc.next();

        if (num <= 4) {
            lowerFour(num, str);
        } else {
            upFour(num, str);
        }
    }
    //翻页
    public static void upFour(int num, String str) {
        //特殊页面
        int index = 1; //光标
        int start = 1; //每页开始第一个

        for (int i = 0; i < str.length(); i++) {
            if (start == 1 && index == 1 && str.charAt(i) == 'U') {
                index = num;
                start = num - 3;
                continue;
            }
            if (start == num - 3 && index == num && str.charAt(i) == 'D') {
                index = 1;
                start = 1;
                continue;
            }
            //普通翻页

            //往上翻页
            if (start == index && str.charAt(i) == 'U') {
                start--;
                index--;
                continue;
            }
            //往下翻页
            if (start + 3 == index && str.charAt(i) == 'D') {
                start++;
                index++;
                continue;
            }
            //不用翻页
            if (str.charAt(i) == 'U') {
                index--;
            }
            if (str.charAt(i) == 'D') {
                index++;
            }
        }

        System.out.print(start + " " + (start + 1) + " " + (start + 2) + " " +
                         (start + 3));
        System.out.println();
        System.out.println(index);
    }

    //<4
    public static void lowerFour(int num, String str) {
        int index = 1; //光标
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == 'U') {
                if (index == 1) {
                    index = num;
                    continue;
                } else {
                    index--;
                    continue;
                }
            }
            if (str.charAt(i) == 'D') {
                if (index == num) {
                    index = 1;
                    continue;
                } else {
                    index++;
                    continue;
                }
            }
        }

        for (int i = 1; i <= num; i++) {
            if (i == num) {
                System.out.println(i);
                break;
            }
            System.out.print(i + " ");
        }
        System.out.println(index);
    }

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西安石油大学C++上机实验 上机三:继承和派生程序设计(2学时)

上机三&#xff1a;继承和派生程序设计&#xff08;2学时&#xff09; 实验目的 了解继承在面向对象程序设计中的重要作用。 理解继承与派生的概念。 掌握通过继承派生出一个新类的方法。 掌握虚基类的作用和用法。 实验内容 P169&#xff1a;5.19, 5.22 上机内容 先设…

Windows 10 上使用 CMake GUI 编译 Krita 源代码并使用 MinGW 64 作为构建工具

krita系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文…

TCP和UDP(嵌入式学习)

TCP和UDPTCP&#xff08;即传输控制协议&#xff09;TCP连接建立(三次握手)TCP连接终止&#xff08;四次挥手&#xff09;UDP &#xff1a;用户数据报协议适用情况UDP 洪水UDP TCP 协议相同点TCP&#xff08;即传输控制协议&#xff09; 是一种面向连接的传输层协议&#xff0…

Vue ElementUI Axios 前后端案例(day01)

前言js 问js是什么&#xff0c;他有什么作用&#xff0c;与html和css的区别是什么 JavaScript&#xff08;简称JS&#xff09;是一种脚本语言&#xff0c;用于在网页上实现交互效果、动态效果和动态数据更新等功能。它是一种解释性语言&#xff0c;需要在浏览器中解释和执行。…

Linux中安装新版minio(centos7版本)

1. 背景需求 由于一些限制,在客户现场的Linux操作系统中,没有安装docker k8s等容器,无法直接使用镜像安装,而且客户要求只能在原始的操作系统中安装最新版的minio,(为什么需要安装最新版的minio,因为检测国网检测到之前版本的minio有漏洞,需要安装新版的minio). 2. 安装minio…

Direct3D 12——纹理——纹理缩小

纹理缩小(miniflcation )是纹理放大的逆运算。在缩小的过程中&#xff0c;大量纹素将被映射到少数纹理之 上 。例如&#xff0c;考虑下列情景&#xff1a;假设有一堵被256x256纹理所映射的墙壁&#xff0c;玩家的观察视角正紧盯着它&#xff0c;并 逐渐向后退却。在此过程中&am…

QML控件--Drawer

文章目录一、控件基本信息二、控件使用三、属性成员一、控件基本信息 Import Statement&#xff1a;import QtQuick.Controls 2.14 Since&#xff1a;Qt 5.7 Inherits&#xff1a;Popup 二、控件使用 Drawer&#xff1a;提供一个可以使用滑动手势打开和关闭的侧面板&#xff…

简述内网渗透中常用的隧道工具

frp 项目地址 https://github.com/fatedier/frp/ 简介 frp 是一个可用于内网穿透的高性能的反向代理应用&#xff0c;支持 tcp, udp 协议&#xff0c;为 http 和 https 应用协议提供了额外的能力&#xff0c;且尝试性支持了点对点穿透。 跨平台支持linux&#xff0c;win&a…

【cmake教程】find_path、find_library、find_program

目录 1、find_path 2、find_library 3、find_program find_path 参考文章&#xff1a;CMake中find_path的使用-CSDN博客 find_library 参考文章&#xff1a;CMake中find_library的使用 1、find_path find_path 一般用于在某个目录下查找一个或者多个头文件&#xff0c;命令…

ASP.NET Core - 依赖注入(一)

1. Ioc 与 DI Ioc 和DI 这两个词大家都应该比较熟悉&#xff0c;这两者已经在各种开发语言各种框架中普遍使用&#xff0c;成为框架中的一种基本设施了。 Ioc 是控制反转&#xff0c; Inversion of Control 的缩写&#xff0c;DI 是依赖注入&#xff0c;Inject Dependency 的…

WebSpider蓝蜘蛛网页抓取工具5.1用户手册

概述 关于网页抓取工具 本工具可以抓取互联网上的任何网页&#xff0c;包括需要登录后才能访问的页面。对抓取到页面内容进行解析&#xff0c;得到结构化的信息&#xff0c;比如&#xff1a;新闻标题、作者、来源、正文等。支持列表页的自动翻页抓取&#xff0c;支持正文页多页…

《Vue3实战》 第二章 创建项目和目录结构

1、创建项目 1.1、命令格式&#xff1a;vue create 项目名称 vue create vue3_example0011.2、运行项目 npm run serve1.2.1、增加run命令 启动时想修改命令&#xff0c;例如&#xff1a; npm run dev1、找到项目根路径下的package.json文件&#xff1b; 2、找到【scripts…

webgl-根据鼠标点击而移动

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

DDoS攻击实验笔记

DoS&DDoS简介 DoS(Denial of Service)&#xff0c;拒绝服务攻击是通过一些方法影响服务的可用性&#xff0c;比如早期主要基于系统和应用程序的漏洞&#xff0c;只需要几个请求或数据包就能导致长时间的服务不可用&#xff0c;但易被入侵检测系统发现。 DDoS(Distributed D…

大数据Flink进阶(十八):Flink执行图和TaskSlot问题思考

文章目录 Flink执行图和TaskSlot问题思考 一、Flink执行图 二、TaskSlot问题思考 Flink执行图和TaskSlot问题思考 一、Flink执行图 Flink代码提交到集群执行时最终会被转换成task分布式的在各个节点上运行,在前面我们学习到DataFlow数据流图

【中级软件设计师】—操作系统考点总结篇(二)

【中级软件设计师】—操作系统考点总结篇&#xff08;二&#xff09; 1.操作系统概述 1.1操作系统的功能 1.2 特殊的操作系统 1.3 进程的概念和状态 进程与程序的区别&#xff1a; 进程是程序的一次执行过程&#xff0c;没有程序就没有进程 程序是一个静态的概念&#xff0c;…

【网络编程】TCP,UDP协议详解

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 TCP协议 TCP协议特点 TCP协议通…

Python 小型项目大全 1~5

一、百吉饼 原文&#xff1a;http://inventwithpython.com/bigbookpython/project1.html 在百吉饼这种演绎逻辑游戏中&#xff0c;你必须根据线索猜出一个秘密的三位数。该游戏提供以下提示之一来响应您的猜测&#xff1a;"Pico"&#xff0c;当您的猜测在错误的位置有…

询问ChatGPT的高质量答案艺术——提示工程指南(更新中……)

目录前言一、提示工程简介二、提示技巧2-1、生成法律文件2-2、添加提示技巧三、角色扮演3-1、智能手机产品描述3-2、添加角色扮演四、标准提示4-1、写一篇有关于新智能手机的评论4-2、添加标准提示、角色提示、种子词提示等等五、示例很少、或者没有示例5-1、生成一个手机配置六…

深度理解PyTorch的WeightedRandomSampler处理图像分类任务的类别不平衡问题

最近做活体检测任务&#xff0c;将其看成是一个图像二分类问题&#xff0c;然而面临的一个很大问题就是正负样本的不平衡问题&#xff0c;也就是正样本&#xff08;活体&#xff09;很多&#xff0c;而负样本&#xff08;假体&#xff09;很少&#xff0c;如何处理好数据集的类…