算法学习——华为机考题库10(HJ64 - HJ69)

算法学习——华为机考题库10(HJ64 - HJ69)

HJ64 MP3光标位置

描述

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

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

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

光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。
在这里插入图片描述
在这里插入图片描述

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

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

示例

在这里插入图片描述

代码解析

#include <iostream>
using namespace std;


int main() {
    int num;
    string str;
    cin>>num;
    cin>>str;

    int cur = 0;
    int left = 0,right;
    if(num >3) right = 3;
    else right = num-1;

    for(auto it:str)
    {
      //  cout<<cur<<" "<<left<<' '<<right<<endl;
        if(it == 'U') 
        {
            cur--;
            cur = cur%num;
            if(cur < 0) cur += num;

            if(num > 4)
            {
                if(cur >= left && cur <= right ) {}
                else if( cur == num-1 ) { left = num - 1 - 3; right = num - 1; }
                else { left-- ; right--; }
            }
        
        }
        else if(it == 'D')
        {
            cur++;
            cur = cur%num;
            if(cur < 0) cur += num;

            if(num > 4)
            {
                if(cur >= left && cur <= right ) {}
                else if( cur == 0 ) { left = 0; right =  3; }
                else { left++ ; right++; }
            }
        } 

       
    }

    for(int i=left ; i<=right ; i++)
    {
        cout<<i+1<<' ';
    }
    cout<<endl;
    cout<<cur+1;

}
// 64 位输出请用 printf("%lld")

HJ65 查找两个字符串a,b中的最长公共子串

描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

数据范围:字符串长度 1≤length≤300
进阶:时间复杂度:O(n 3) ,空间复杂度:O(n)
输入描述:
输入两个字符串

输出描述:
返回重复出现的字符

示例

在这里插入图片描述

代码解析

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

int main() {
    string str1,str2;
    cin>>str1>>str2;

    if(str1.size() > str2.size())
    {
        string tmp = str1;
        str1 = str2;
        str2 = tmp;
    }

    int m = str1.size() , n = str2.size();
    vector<vector<int>> dp(m+1,vector<int>(n+1,0));

    int indnx , lenght = 0;
    for(int i=1 ; i<=m ;i++)
    {
        for(int j=1 ; j<=n ;j++)
        {
            if(str1[i-1] == str2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
            if(dp[i][j] > lenght)
            {
                lenght = dp[i][j];
                indnx = i;
            }
        }
    }

    // for(int i=0 ; i<=m ;i++)
    // {
    //     for(int j=0 ; j<=n ;j++)
    //     {
    //         cout<<dp[i][j]<<' ';
    //     }
    //     cout<<endl;
    // }

    string result(str1.begin()+indnx-lenght , str1.begin() + indnx);

    cout<<result;

}
// 64 位输出请用 printf("%lld")

HJ66 配置文件恢复

描述

有6条配置命令,它们执行的结果分别是:
在这里插入图片描述
注意:he he不是命令。

为了简化输入,方便用户,以“最短唯一匹配原则”匹配(注:需从首字母开始进行匹配):

1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what;
2、若只输入一字串,但匹配命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,但是该命令有两个关键词,所有匹配失败,执行结果为:unknown command

3、若输入两字串,则先匹配第一关键字,如果有匹配,继续匹配第二关键字,如果仍不唯一,匹配失败。
例如输入:r b,找到匹配命令reset board 和 reboot backplane,执行结果为:unknown command。
例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。
4、若输入两字串,则先匹配第一关键字,如果有匹配,继续匹配第二关键字,如果唯一,匹配成功。例如输入:bo a,确定是命令board add,匹配成功。
5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:b addr,无法匹配到相应的命令,所以执行结果为:unknow command。
6、若匹配失败,打印“unknown command”

注意:有多组输入。
数据范围:数据组数:1≤t≤800 ,字符串长度1≤s≤20
进阶:时间复杂度:O(n) ,空间复杂度:O(n)
输入描述:
多行字符串,每行字符串一条命令

输出描述:
执行结果,每条命令输出一行

示例

在这里插入图片描述

代码解析

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

vector<pair<string, string>> instr = { {"reset",""},
                                        {"reset","board"},
                                        {"board","add"},
                                        {"board","delete"},
                                        {"reboot","backplane"},
                                        {"backplane","abort"}};    //存放每一对关键字

vector<string> outstr = {    "reset what","board fault","where to add",
                               "no board at all","impossible","install first"};    //存放每条命令对应执行结果

int main() {
    string str;
    while ( getline(cin,str) ) { // 注意 while 处理多个 case

        stringstream ss(str);
        string key;
    
        vector<string> date;

        while( getline(ss, key, ' ') )
        {
            date.push_back(key);
        }

        int count = 0;
        string result;
        for(int i=0 ; i<instr.size() ; i++)
        {
            int i1 = instr[i].first.find(date[0]);
            int i2;
            if(date.size() == 2 )
            {
                i2 = instr[i].second.find(date[1]);
                
            }else if( date.size() == 1 && instr[i].second.empty() == 1)
            {
                i2 = 0;

            }else i2 = -1;
            
            if( i1 == 0 && i2 == 0 )
            {
                count++;
                result = outstr[ i ];
            }

        }

        if(count == 1) cout<<result<<endl;
        else cout<<"unknown command"<<endl;
        
        str.clear();
        date.clear();

    }
}
// 64 位输出请用 printf("%lld")

HJ67 24点游戏算法

描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。
输入描述:
读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。

输出描述:
对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false

示例

在这里插入图片描述

代码示例

#include <iostream>
#include <vector>

using namespace std;

bool flag = false;
void track(vector<double> &date ,vector<bool> &path , int indnx , double result)
{
    if( indnx > 4 || flag == true ) return;
    //cout<<indnx<<' '<<result<<endl;
    if(  result == 24 )
    {
        flag = true;
        return;
    }

    for(int i=0 ; i<date.size() ;i++)
    {
        if(path[i] == false)
        {
            path[i] = true;
            track(date, path, indnx + 1 , result + date[i]);
            track(date, path, indnx + 1 , result - date[i]);
            track(date, path, indnx + 1 , result * date[i]);
            track(date, path, indnx + 1 , result / date[i]);
            path[i] = false;
        }
    }
    
}

int main() {
    int tmp;
    vector<double> date;
    
    while (cin >> tmp) { // 注意 while 处理多个 case
        date.push_back(tmp);
    }
    vector<bool> path(date.size(),false);

    track(date,path,0,0);

    if(flag == true) cout<<"true"<<endl;
    else cout<<"false"<<endl;

}
// 64 位输出请用 printf("%lld")

HJ68 成绩排序

描述

给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩

都按先录入排列在前的规则处理。

例示:
jack 70
peter 96
Tom 70
smith 67

从高到低 成绩
peter 96
jack 70
Tom 70
smith 67

从低到高

smith 67

jack 70

Tom 70
peter 96

注:0代表从高到低,1代表从低到高

**数据范围:**人数:1≤n≤200
进阶:时间复杂度:O(nlogn) ,空间复杂度:O(n)
输入描述:
第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开

输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例

在这里插入图片描述

代码解析

#include <iostream>
#include <utility>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

static bool cmp1( pair<string,int> a, pair<string,int>  b )
{
    return a.second > b.second;
}

static bool cmp2( pair<string,int> a, pair<string,int>  b )
{
    return a.second < b.second;
}

int main() {
    int n;
    int flag;
    vector<pair<string,int>> date;
    cin>>n;
    cin>>flag;
    string name;
    int num;
    while (n--) { // 注意 while 处理多个 case
        cin>>name>>num;
        pair<string, int> tmp;
        tmp.first = name;
        tmp.second = num;
        date.push_back( tmp );
    }

    if(flag == 0) stable_sort(date.begin(), date.end() , cmp1);
    else stable_sort(date.begin(), date.end() , cmp2);

    for(int i=0 ; i<date.size() ;i++)
        cout<<date[i].first<<' '<<date[i].second<<endl;

    return 0;
}
// 64 位输出请用 printf("%lld")

HJ69 矩阵乘法

描述

如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的
在这里插入图片描述
矩阵的大小不超过100*100
输入描述:
第一行包含一个正整数x,代表第一个矩阵的行数
第二行包含一个正整数y,代表第一个矩阵的列数和第二个矩阵的行数
第三行包含一个正整数z,代表第二个矩阵的列数
之后x行,每行y个整数,代表第一个矩阵的值
之后y行,每行z个整数,代表第二个矩阵的值

输出描述:
对于每组输入数据,输出x行,每行z个整数,代表两个矩阵相乘的结果

示例

在这里插入图片描述

代码解析

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int x1,x2,y1,y2;
    cin>>x1>>x2>>y2;
    y1 = x2;
    vector<vector<int>> date1(x1,vector<int>(y1,0));
    vector<vector<int>> date2(x2,vector<int>(y2,0));
    vector<vector<int>> result(x1,vector<int>(y2,0));

    int tmp;
    for(int i=0 ; i < x1 ; i++)
    {
        for(int j=0 ; j < y1 ; j++)
        {
            cin>>tmp;
            date1[i][j] = tmp;
        }
    }

    for(int i=0 ; i < x2 ; i++)
    {
        for(int j=0 ; j < y2 ; j++)
        {
            cin>>tmp;
            date2[i][j] = tmp;
        }
    }

    for(int i=0 ; i < x1 ; i++)
    {
        for(int j=0 ; j < y2 ; j++)
        {
            tmp = 0;
            for(int k=0 ; k< y1 ; k++)
            {
                result[i][j] += (date1[i][k] * date2[k][j]);
            }
            cout<<result[i][j]<<' ';
        }
        cout<<endl;
    }

}
// 64 位输出请用 printf("%lld")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最新版鸿蒙HarmonyOS开发工具安装使用指南

2024最新版鸿蒙HarmonyOS开发工具安装使用指南 By JacksonML 0. 什么是鸿蒙Harmony OS&#xff1f; 华为鸿蒙系统&#xff08;HUAWEI Harmony OS&#xff09;&#xff0c;是华为公司在2019年8月9日于东莞举行的华为开发者大会&#xff08;HDC.2019&#xff09;上正式发布的分…

JavaWeb:调出Maven面板

问题描述 情况说明&#xff1a;IDEA中找不到Maven面板&#xff0c;Maven面板如下图所示&#xff1a; 解决方案 选择 View > Appearance > Tool Window Bars&#xff1a; 然后就会出现Maven面板了。

SSO单点登录系统?or 统一身份中台?

单点登录&#xff08;Single Sign-On&#xff0c;简称 SSO&#xff09;是解决多个应用系统多次认证登录的一种方式&#xff0c;从应用侧切入&#xff0c;提高员工使用便利性&#xff0c;但未解决身份&#xff08;账号&#xff09;真正统一。传统路径通过属性映射方式完成各个账…

Hack The Box-Challenges-Misc-M0rsarchive

解压压缩包&#xff0c;里面是一张图片和一个新的zip文件 图片放大后的图案是----. 考虑到为莫斯密码&#xff0c;将其解密 密码为9&#xff0c;继续解压缩包 又是一张莫斯密码图加压缩包&#xff0c;写一段脚本去解密图片中的莫斯密码&#xff0c;并自动解压缩包 import re i…

MQ面试题整理(持续更新)

1. MQ的优缺点 优点&#xff1a;解耦&#xff0c;异步&#xff0c;削峰 缺点&#xff1a; 系统可用性降低 系统引入的外部依赖越多&#xff0c;越容易挂掉。万一 MQ 挂了&#xff0c;MQ 一挂&#xff0c;整套系统崩 溃&#xff0c;你不就完了&#xff1f;系统复杂度提高 硬生…

HiveSQL题——array_contains函数

目录 一、原创文章被引用次数 0 问题描述 1 数据准备 2 数据分析 ​编辑 3 小结 二、学生退费人数 0 问题描述 1 数据准备 2 数据分析 3 小结 一、原创文章被引用次数 0 问题描述 求原创文章被引用的次数&#xff0c;注意本题不能用关联的形式求解。 1 数据准备 i…

本次安装Visual Studio 所用的安装程序不完整。请重新运行VisualStudio安装程序以解决此问题

今天点开VS的时候遇到了这个问题 因为昨天升级到一半电脑关机了&#xff0c;今天打开软件遇到如下错误&#xff0c; 解决办法很简单&#xff0c;找到安装目录进入Installer文件夹 我的目录在C:\Program Files (x86)\Microsoft Visual Studio\Installer 找到vs_installer.exe…

idea修改项目git地址

大家好&#xff0c;今天给大家分享的知识是如何在idea中修改项目的git地址。 一、修改地址 首先我们先找到菜单栏中Git选项&#xff0c;然后点击管理远程&#xff08;Manage Remote&#xff09; 之后双击origin之后就可以定义名称或者URL了。

oracle主库增加redo组数

redo log&#xff08;重做日志&#xff09;&#xff1a; 重做日志&#xff1a;简单来说就是&#xff0c;将oracle数据库的DML、DDL&#xff08;数据库操作语言&#xff0c;数据库定义i语言&#xff09;操作记录在日志中&#xff0c;方便恢复及备库使用&#xff0c;以组的方式管…

《Lua程序设计》-- 学习11

反射&#xff08;Re fl ection&#xff09; 反射是程序用来检查和修改其自身某些部分的能力 调试库由两类函数组成&#xff1a;自省函数&#xff08;introspective function&#xff09;和钩子&#xff08;hook&#xff09;。自省函数允许我们检查一个正在运行中的程序的几个…

【实训】网络系统集成课程实训(vlan、vrrp、nat)

目录 一 实训概述 1.1 实训目的 1.2 实训内容 二 实训原理 2.1 VLAN间划分及VLAN间通信 2.2 BGP&#xff0c;边界网关协议 BGP是运行于 TCP 上的一种自治系统的路由协议&#xff0c;用于在AS之间实现路由信息的交互。 2.2.1 VRRP原理 2.2.2 OSPF配置 三&#xff0e;实训…

docker重建镜像

DockerFile如下&#xff1a; FROM k8s-registry.qhtx.local/base/centos7-jdk8-haitong0704RUN yum -y update && yum install -y python3-devel && yum install -y python36 RUN mv /usr/bin/python /usr/bin/python_old RUN ln -s /usr/bin/python3 /usr/bi…

我用JVS低代码平台,搭建了一套固定资产管理系统

随着企业规模的不断扩大和业务的快速发展&#xff0c;资产管理成为了企业运营中的重要环节。然而&#xff0c;传统的手工管理模式已经无法满足现代企业的需求&#xff0c;管理效率低下、信息不准确、流程不规范等问题逐渐凸显。为了解决这些问题&#xff0c;越来越多的企业开始…

将xyz格式的GRACE数据转成geotiff格式

我们需要将xyz格式的文件转成geotiff便于成图&#xff0c;或者geotiff转成xyz用于数据运算&#xff0c;下面介绍如何实现这一操作&#xff0c;采用GMT和matlab两种方法。 1.GMT转换 我们先准备一个xyz文件&#xff0c;这里是一个降水文件。在gmt中采用以下的语句实现xyz转grd…

Java栈和队列

&#x1f435;本文章将对栈相关知识进行讲解 一、什么是栈 栈是一种特殊的线性表&#xff0c;向栈中放入元素的次序是由栈底到栈顶依次放入&#xff0c;被称为入栈或压栈&#xff0c;从栈中出元素时只能从栈顶出&#xff0c;被称为出栈。即栈要求元素“先进后出” 下面给一道经…

Vivado-IP核

Vivado-IP核 主程序 timescale 1ns / 1ps ////module ip_clk_wiz(input sys_clk,input sys_rst_n,output clk_out1,output clk_out2,output clk_out3,output clk_out4,output locked);clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_out1), // output clk_out…

ywtool login guard命令

一.登录防护功能介绍 登录防护功能主要检查系统日志/var/log/secure&#xff0c;查看系统有没有被暴力登录。登录防护默认是检测3分钟内登录系统失败15次(次数可修改)后,视其为有攻击性,拉黑此IP(centos7通过系统文件阻止IP,centos8/9通过防火墙阻止IP)。此脚本只针对SSH访问,…

layui

基于复杂结构的自定义模版相关介绍 我这里的接口给的格式数据 我这里搜索往返时候要显示成这样的 layui.use([table,form], function(){ var table layui.table; var form layui.form;// 渲染表格 table.render({ elem: #test-table-reload,toolbar: #toolbarDemo, …

【Python基础】seaborn 使用指南(超详细!)

文章目录 seaborn1 seaborn简介1.1 主要特征&#xff1a;1.2 seaborn主要内容 2 seaborn基本设置2.1 图表大小&#xff1a;context2.2 设置风格2.3 设置字体与支持中文2.4 设置临时风格2.5 设置调色板2.6 set方法 3 调色板3.1 分类色板&#xff08;qualitative&#xff09;3.2 …

3.0 Hadoop 概念

本章着重介绍 Hadoop 中的概念和组成部分&#xff0c;属于理论章节。如果你比较着急可以跳过。但作者不建议跳过&#xff0c;因为它与后面的章节息息相关。 Hadoop 整体设计 Hadoop 框架是用于计算机集群大数据处理的框架&#xff0c;所以它必须是一个可以部署在多台计算机上…