《华为机试》——MP3光标位置 及 洗牌

news2025/1/13 10:32:23

本期,我给大家带来以下两个题目的讲解:

  • 1、《华为机试》——MP3光标位置 (中等)
  • 2、  2017年校招真题——洗牌 (简单)

以上两个题的难度属于我也给大家标注出来了,接下来,我们一起去分析一波这两个题!


目录

1、MP3光标位置

🤜 题意分析 🤛

🤜 解题思路 🤛

🤜 代码展示 🤛

2、洗牌

🤜 题意分析 🤛

🤜 解题思路 🤛

🤜 代码展示 🤛


1、MP3光标位置

我们先来研究一下第一个题,首先,我们还是先从题干下手进行理解:

题目如下 :👇

 

输入描述:

  • 1 输入歌曲数量
  • 2 输入命令 U或者D

输出描述:

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

示例1

输入:
10
UUUU

输出:
7 8 9 10
7

🤜 题意分析 🤛

第一眼看到这个题,可能会觉得这个一定非常复杂,其实不然,大家通过对题干的解读,我们可以发现其实本题的意思很简单。相信大家应该都使用过mp3的或者原来那个按键手机,有了上述的生活常识理解起来就非常简单。就是对其进行分类讨论,然后针对每种不同的情况进行解析即可!!

我们示例给大家分析一波:

  • 初始时:

  •  第一步:

 

  • 第二步:

 

  • 第三步:

 

  • 第四步:

 

结束操作之后,此时我们还是处于当前页,因此此时first为7,所经历过的有 7,8,9,10 位置,因此最终的输出结果即为我们上述演示的这样。

🤜 解题思路 🤛

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

🤜 代码展示 🤛

#include <iostream>
#include<string>
using namespace std;

int main() {
    int n;
    string cmd;
    while (cin >> n >> cmd) {
//将n首歌进行编号1:n,其中num代表当前光标所在的歌曲编号,first代表当前页的第一首歌曲的编号
        int num = 1, first = 1;
        if (n <= 4) {
            //歌曲总数<=4
            for (int i = 0; i < cmd.size(); ++i) {
             //解析命令
                if (num == 1 && cmd[i] == 'U')
                    num = n;
                else if (num == n && cmd[i] == 'D')
                    num = 1;
                else if (cmd[i] == 'U')
                    num--;
                else
                    num++;
            }
            for (int i = 1; i <= n; ++i)
                cout << i << " ";
            cout << endl;
            cout << num << endl;
        } else {
                //歌曲总数>4
            for (int i = 0; i < cmd.size(); ++i) {
                //解析命令
                if (first == 1 && num == 1 && cmd[i] == 'U') {
                    first = n - 3; //将first跳入最后一页
                    num = n;
                } else if (first == n - 3 && num == n && cmd[i] == 'D') {
                    first = num = 1;
                } else if (first != 1 && num == first && cmd[i] == 'U') {
                    first--;
                    num--;
                } else if (first != n - 3 && num == first + 3 && cmd[i] == 'D') {
                    first++;
                    num++;
                } else if (cmd[i] == 'U')
                    num--;
                else
                    num++;
            }
            for (int i = first; i <= first + 3; ++i)
                cout << i << " ";
            cout << endl;
            cout << num << endl;
        }
    }
    return 0;
}

2、洗牌

紧接着研究一下第二个题,首先,我们还是先从题干下手进行理解:

题目如下 :👇

示例1 

3
3 1
1
2
3
4
5
6
3 2
1
2
3
4
5
6
2 2
1
1
1
1

🤜 题意分析 🤛

本题的意思是第一行输入歌曲数量,第二行输入指令,最后需要显式的输出也为两行,第一行为当前歌曲所在的列表,第二行为光标所指向的歌曲。

  • 初始时: 

 就开始移动 j 的下标,此时根据相应的公式我们可以得出洗一次牌之后第一个元素所处的位置,最后根据公式即可得出第一次洗完牌之后各元素所处的位置

🤜 解题思路 🤛

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

🤜 代码展示 🤛

#include <iostream>
#include<vector>
using namespace std;


int main() {
    int n, m, k;
    cin >> n;
    while (n--) {
        cin >> m >> k;
        int num = 2 * m;
        vector<int> arr(num);

        for (int i = 0; i < num; ++i) {
            cin >> arr[i];
        }

        //开始洗牌
        for (int i = 0; i < k; ++i) {
            vector<int>tmp(arr.begin(), arr.end());
            for (int j = 0; j < m; ++j) {
                arr[2 * j] = tmp[j]; //左手的牌排放的位置
                arr[2 * j + 1] = tmp[j + m];//右手的牌排放的位置
            }
        }

        //输出洗牌的顺序
        for (int i = 0; i < num - 1; ++i)
            cout << arr[i] << " ";
        cout << arr[num - 1] << endl; //最后一张牌后面不能有空格
    }
}
// 64 位输出请用 printf("%lld")

到此,本期的题目讲解便到此结束了!!!

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

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

相关文章

利用chatgpt处理Excel数据

一 前言 以前用chatgpt主要做问答&#xff0c;这次加入星球学习到了如何用chatgpt处理Excel&#xff0c;虽然现在处理起来还不是很方便&#xff0c;用熟悉了&#xff08;主要是熟悉提示词&#xff09;&#xff0c;处理起来会越来越快的。 二 准备工作 一个可用的chatgpt账号&…

针对jar和vue的一键自动化部署工具,界面友好操作简单

easy-jenkins是一款对vue和jar的部署工具&#xff0c;操作简单&#xff0c;实行一键部署&#xff0c;内部结构采用流水线形式架构&#xff0c;每次部署&#xff0c;时时提供部署过程&#xff0c;部署记录&#xff0c;界面友好简洁&#xff0c;使用方便&#xff0c;符合用户常规…

HTML学习(5)Canvas绘图

文章目录 HTML5 CanvasHTML5 内联SVG HTML5 Canvas 使用 Canvas 进行绘图工作&#xff0c;Canvas元素用于在网页上绘制图片。 创建一个Canvas的元素&#xff1a; <canvas id"myCanvas" width"200" height"100"></canvas>但是Canv…

设计模式 -- 装饰模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

操作系统原理 —— 什么是中断?(四)

我们先来看看早期的计算机的工作流程&#xff1a; 如上图&#xff0c;在早期的计算机假设有三个程序需要执行&#xff0c;执行顺序是&#xff1a;先执行程序1&#xff0c;等待程序1结束之后&#xff0c;再开始执行程序2&#xff0c;以此类推&#xff0c;所以它们是串行执行的…

使用ChatGPT编写Python接口的指南

使用ChatGPT编写Python接口的指南 ChatGPT是一种自然语言处理技术&#xff0c;可以用于各种文本生成任务。在本文中&#xff0c;我们将介绍如何使用Python编写ChatGPT的接口&#xff0c;并提供一些有用的技巧和示例代码。 步骤一&#xff1a;安装所需的库 在编写ChatGPT接口…

数据仓库的概念及与数据库等对比

1、什么是数据仓库&#xff1f; 数据仓库是信息&#xff08;对其进行分析可做出更明智的决策&#xff09;的中央存储库。通常&#xff0c;数据定期从事务系统、关系数据库和其他来源流入数据仓库。业务分析师、数据工程师、数据科学家和决策者通过商业智能 (BI) 工具、SQL 客户…

SOLIDWORKS机械设计如何控制尺寸?

机械设计过程中的尺寸把握&#xff0c;实际就是一个人的设计能力的体现&#xff0c;如果你不具备相应的设计能力&#xff0c;那所谓的尺寸把握是做不好的。所以今天在这里分享一套基本的设计流程和方法给大家&#xff0c;只有切实可行的方法才能打通你走向完善的专业技能之路。…

测试老鸟总结,性能测试如何做?常见异常有哪些?解决方法...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 常见的性能异常 …

1.Introduction: Hands-on Graph Neural Networks

PyG&#xff08;PyTorch Geometric&#xff09;是一个基于PyTorch的库&#xff0c;用于轻松编写和训练图形神经网络&#xff08;GNN&#xff09;&#xff0c;用于与结构化数据相关的广泛应用。博客好久没有更新了&#xff0c;恰逢1024创作纪念日&#xff0c;浅浅更新一下吧。 这…

logging模块

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 logging模块 日志级别修改logging模块默认行为logger对象 专栏&#xff1a;《python从入门到实战》 日…

MACH SYSTEMS网关:SAE J2716(SENT) 转 RS-232/CAN

双通道SAE J2716&#xff08;SENT&#xff09;至RS-232/CAN总线网关&#xff0c;具有两个双向SENT通道和RS-232&#xff08;SENT-RS232&#xff09;或CAN总线&#xff08;SENT-CAN&#xff09;接口。两种变体还提供两个模拟输出&#xff0c;可以直接将输入SENT数据转换为模拟电…

VMware SD-WAN 5.1 - 软件定义的 WAN

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-sd-wan-5/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 产品概述 软件定义的 WAN (SD-WAN) SD-WAN 的功能特性 简化的 SD-WAN 了解软件定义的 WAN (SD-WAN) 的概…

Java后台POST请求以application/x-www-form-urlencoded;charset=utf-8格式以及raw的JSON的请求方式

一、Java后台POST请求以application/x-www-form-urlencoded; 1、引入依赖&#xff1a; <dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version> </dependency&g…

Gartner发布中国容器管理平台供应商识别指南,灵雀云实力入选

近日&#xff0c;国际权威分析机构Gartner发布了《Tool: Vendor Identification for Container Management in China》报告&#xff0c;该报告旨在帮助IT基础架构领域相关人员选择在中国提供容器管理服务、解决方案和平台的供应商&#xff0c;为容器产品选型提供专业指导。灵雀…

工作流调度系统 Azkaban使用方法大全(二)

1 案例 1.1 Hello World first.project azkaban-flow-version: 2.0first.flow nodes:- name: jobAtype: commandconfig:command: echo "hi 大佬"打包为zip&#xff0c;即可上传 name&#xff1a;job名称 type&#xff1a;job类型。command表示要执行作业的方式…

《Java8实战》第7章 并行数据处理与性能

7.1 并行流 Stream 接口能非常方便地并行处理其元素&#xff1a;对收集源调用 parallelStream 方法就能将集合转换为并行流。并行流就是一个把内容拆分成多个数据块&#xff0c;用不同线程分别处理每个数据块的流。 public long sequentialSum(long n) { return Stream.itera…

跌倒检测和识别1:跌倒检测数据集(含下载链接)

跌倒检测和识别1&#xff1a;跌倒检测数据集(含下载链接) 目录 跌倒检测和识别1&#xff1a;跌倒检测数据集(含下载链接) 1. 前言 2. 跌倒姿态&#xff1a;站立-弯腰(蹲下)-躺下 3. 跌倒检测数据集&#xff1a; &#xff08;1&#xff09;Fall-Down-Det-v1 &#xff08;2…

k8s client-go 程序实现kubernetes Controller Operator 使用CRD 学习总结

k8s client-go 程序实现kubernetes Controller & Operator 使用CRD 学习总结 大纲 1 定义CRD2 client-go自动代码生成3 client-go操作CR4 创建镜像5 配置权限6 部署到k8s 基础流程 这里使用client-go实现编写&#xff0c;相对于kubebuiler这些工具生成脚手架工程要麻烦…

学习零碎-txt转json

import re import jsondef txtToJson():# 文件路径path "./prot.txt"# 读取文件with open(path, r, encoding"utf-8") as file:# 定义一个用于切割字符串的正则# seq re.compile(":")result []# 逐行读取for line in file:lst line.split(#)…