算法|牛客网华为机试21-30C++

牛客网华为机试
上篇:算法|牛客网华为机试10-20C++

文章目录

  • HJ21 简单密码
  • HJ22 汽水瓶
  • HJ23 删除字符串中出现次数最少的字符
  • HJ24 合唱队
  • HJ25 数据分类处理
  • HJ26 字符串排序
  • HJ27 查找兄弟单词
  • HJ28 素数伴侣
  • HJ29 字符串加解密
  • HJ30 字符串合并处理

HJ21 简单密码

题目描述:
在这里插入图片描述

解题思路:
使用switch case加ASCII码大小写字母差32来解答,33为向后移动一位。
解法:

#include <iostream>
 
using namespace std;
 
int main() {
    string str;
    cin >> str;
 
    for (int i=0; i<str.size(); i++) {
        switch(str[i]) {
            case 'A' ... 'Y': str[i] += 33; break;
            case 'Z': str[i] = 'a'; break;
            case 'a' ... 'c': str[i] = '2'; break;
            case 'd' ... 'f': str[i] = '3'; break;
            case 'g' ... 'i': str[i] = '4'; break;
            case 'j' ... 'l': str[i] = '5'; break;
            case 'm' ... 'o': str[i] = '6'; break;
            case 'p' ... 's': str[i] = '7'; break;
            case 't' ... 'v': str[i] = '8'; break;
            case 'w' ... 'z': str[i] = '9'; break;
            default: break;
        }
    }
    cout << str << endl;
}

HJ22 汽水瓶

题目描述:
在这里插入图片描述

解题思路:
可以接空瓶子,相当于每有两个空瓶就可以喝一瓶,结果直接除以2即可。
解法:

#include <iostream>
using namespace std;

int main() {
    int a;
    while (cin >> a) { // 注意 while 处理多个 case
        if(a == 0)
            break;
        cout<< a/2 <<endl;
    }
}

HJ23 删除字符串中出现次数最少的字符

题目描述:
在这里插入图片描述

解题思路:
首先使用map将所有字母出现次数记录;第二步找出出现次数最少的次数,如果为1就是最少的;第三步找出所有出现次数最少的字母;最后排除所有出现次数最少的字母输出结果。
解法:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm> // 包含 std::find
using namespace std;

int main() {
    string str;
    cin>>str;
    map<char,int> all_char; // key:字母 value:出现的次数
    for(auto a:str){
        // 如果只出现过一次
        if(all_char.find(a) == all_char.end())
        {
            all_char[a] = 1;
            continue;
        }
        else
        {
            all_char[a]++;
        }
    }
    // 找出出现最少的次数
    int min_int = 0;
    for(auto one_char:all_char){
        if(min_int == 0)
            min_int = one_char.second;
        if(min_int>one_char.second)
        {
            min_int = one_char.second;
            if(min_int == 1)
                break;
        }
    }
    vector<char> min_char;
     // 使用迭代器遍历map 找出所有出现次数最少的字母
    for (auto it = all_char.begin(); it != all_char.end(); ) {
        if (it->second == min_int) {
            min_char.push_back(it->first);
        } 
        ++it;
    }
    // 如果字母不是最少出现的字母之一 输出
    for(auto c:str){
        if(std::find(min_char.begin(), min_char.end(), c) == min_char.end())
            cout<<c;
    }
}

HJ24 合唱队

题目描述:
在这里插入图片描述

解题思路:
使用动态规划,找到最长递增子序列+最长递减子序列;
解法:

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

int main() {
    int n;
    while (cin>>n) {
        // 输入的数组
        int tmp;
        vector<int> vec;
        for(int i=0;i<n;++i){
            cin>>tmp;
            vec.push_back(tmp);
        }

        // 最长递增子序列长度
        if(vec.empty()) return 0;
        vector<int> dp1(n,0);	
        for(int i=0;i<n;++i){
            dp1[i] = 1;
            for(int j=0;j<i;++j){
                if(vec[i]>vec[j])
                    dp1[i] = max(dp1[i],dp1[j]+1);
            }
        }

        // 最长递减子序列长度
        vector<int> dp2(n,0);
        for(int i = n-1; i >= 0;--i){
            dp2[i] = 1;
            for(int j=n-1;j>i;--j){
                if(vec[i] > vec[j])
                    dp2[i] = max(dp2[i], dp2[j]+1);
            }
        }
        int maxLength = 0;
        for(int i=0;i<n;++i){
            // i是中点
            if(maxLength<dp1[i]+dp2[i]-1){
                maxLength = dp1[i]+dp2[i]-1;
            }
        }
        cout<< n-maxLength<<endl;
    }
    return 0;
}

HJ25 数据分类处理

题目描述:

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

解题思路:
就是找I里是否包含R的子串,输出索引和值。

解法:

// 就是找I里是否包含R的子串,输出索引和值
#include <bits/stdc++.h>

using namespace std;

int main() {
    // 这个是把我们的I数组输入进去
    int n;
    cin >> n;
    vector<string> I(n);
    for (auto &it : I) cin >> it;
    // 这个实现了我们R数组的去重和排序
    int m;
    cin >> m;
    set<int> st;
    for (int i = 1; i <= m; i++) {
        int tmp;
        cin >> tmp;
        st.insert(tmp);
    }

    vector<int> res;
    for (auto &it : st) {
        // cnt是有多少个
        // okk是我们是否找到
        int cnt = 0;
        bool okk = false;
        for (auto &it1 : I) {
            // 如果找到了存入数组
            if (it1.find(to_string(it)) != string::npos) {
                cnt += 1;
                if (okk == false) {
                    res.emplace_back(it);
                    okk = true;
                }
            }
        }
        // !=0说明有找到
        if (cnt != 0) {
            // 我们每一次把我们的下标和我们的值存入
            res.emplace_back(cnt);
            for (int i = 0; i < n; i++) {
                if (I[i].find(to_string(it)) != string::npos) {
                    res.emplace_back(i);
                    res.emplace_back(stoi(I[i]));
                }
            }
        }
    }
    cout << res.size() << " ";
    for (auto &it : res) {
        cout << it << " ";
    }
    cout << "\n";
    return 0;
}

HJ26 字符串排序

题目描述:
在这里插入图片描述

解题思路:
首先利用和大小写字母A的差值,对应0-26,来将所有字母按顺序排好;再找出原始字符串里所有字母进行替换。
解法:

#include <iostream>
#include <vector>
using namespace std;
string String_Sorting(string str)
{
    int len = str.size(); //获取字符串长度
    vector <char> vec; //用一个 char 型的向量存储按规则排序后的字符串中的字母字符
    //规则一:英文字母从 A 到 Z 排列,不区分大小写。
    //规则二:同一个英文字母的大小写同时存在时,按照输入顺序排列。
    for (int j = 0; j < 26; j++)
    {
        for (int i = 0; i < len; i++)
        {
            // 如果是大写字母或者小写字母 按照a-z顺序放入 对应0-26
            if ((str[i] - 'a' == j) || (str[i] - 'A' == j))
            {
                vec.push_back(str[i]); //将符合规则的字母字符先后写入向量
            }
        }
    }
    //规则三:非英文字母的其它字符保持原来的位置。
    for(int i = 0,k = 0;(i < len) && (k < vec.size()); i++)
    {
        // 如果str当前的值是大写或者小写字母 替换为vec里排好顺序的值
        if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
        {
            str[i] = vec[k++];
        }
    }
    return str; //返回按规则排序好后的字符串
}
//主函数
int main()
{
    string str;
    while (getline(cin, str))
    {
        cout << String_Sorting(str) << endl;
    }
    return 0;
}

HJ27 查找兄弟单词

题目描述:
在这里插入图片描述

解题思路:
见注释。
解法:

#include <iostream>
#include <stdexcept>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
// 判断两个字符串是否为兄弟单词
bool is_brother(string str1,string str2){
    if(str1 == str2 || str1.size()!=str2.size())
        return false;
    else {
        // 将str1所有字母出现统计
        map<char,int> str1_map;
        for(auto one:str1){
            if(str1_map.find(one) == str1_map.end()){
                str1_map[one] = 1;
            }
            else{
                str1_map[one]++;
            }
        }
        // 如果str2发现一个删除一个
        for(auto one:str2){
            // 如果有字母str1没有直接退出
            if(str1_map.find(one) == str1_map.end()){
                return false;
            }
            else{
                str1_map[one]--;
                if(str1_map[one] == 0)
                    str1_map.erase(one);
            }
        }
        if (str1_map.size() == 0) {
            return true;
        }
        else {
            return false;
        }
    }
}

int main() {
    // 输入字典中单词的个数n
    int size;
    cin>>size;
    // 再输入n个单词作为字典单词
    vector<string> str_vec;
    for (int i=0; i<size; ++i) {
        string str;
        cin>>str;
        str_vec.push_back(str);
    }
    // 输入一个单词x
    string com_str;
    cin>>com_str;
    // 最后后输入一个整数k
    int index;
    cin>>index;
    // 输出字符串 如果是兄弟单词放入容器
    vector<string> output_vec;
    for(int i=0;i<str_vec.size();++i){
        if(is_brother(str_vec[i],com_str)){
            output_vec.push_back(str_vec[i]);
        }
    }
    // 字典序排序
    sort(output_vec.begin(), output_vec.end());  
    cout<<output_vec.size()<<endl;
    // 如果索引合法输出
    if(index <= output_vec.size()+1 && output_vec.size() > 0)
        cout<<output_vec.at(index-1);
}

HJ28 素数伴侣

题目描述:
在这里插入图片描述

解题思路:
题解 | #素数伴侣#
将问题分解,首先整理出奇数数组和偶数数组,再查找每个偶数匹配哪个奇数,判断两数和是否是素数,使用find迭代获取匹配结果。
解法:

#include <iostream>
#include <vector>
using namespace std;
// 判断一个数是否是素数
bool isprime(int num){
    for(int i=2;i*i<=num;++i){  // 判断一个数是否为素数
        if(num % i == 0)    // 检查有无余数
            return false;
    }
    return true;
}

// 参数:待匹配的奇数;偶数数组;是否被使用过了;匹配数组索引是偶数数组size,值为匹配的奇数值
bool find(int num,vector<int>& evens,vector<bool>& used,vector<int>& match){
    // 遍历每个偶数与奇数比较
    for(int i=0;i<evens.size();++i){ 
        if(isprime(num+evens[i]) && !used[i]){
            used[i] = true;
            // 如果第i个偶数还未配对,或者跟它配对的奇数还有别的选择
            if(match[i] == 0 || find(match[i],evens,used,match)){
                //则配对该数
                match[i] = num;
                return true;
            }
        }
    }
    return false;
}

int main() {
    //  输入一个正偶数 n
    int n;
    while (cin>>n) {
        // 输入 n 个整数
        vector<int> odds,evens,nums(n);
        for(int i=0;i<n;++i){
            cin>>nums[i];
            if(nums[i]%2) // 奇数
                odds.push_back(nums[i]);
            else // 偶数
                evens.push_back(nums[i]);
        }
        int count = 0;
        // 缺少奇数或者偶数无法构成素数
        if(odds.size() == 0 || evens.size() == 0){
            cout<<count<<endl;
            continue;
        }
        // 统计每个偶数的配对是哪个奇数
        vector<int> match(evens.size(),0);  
        //遍历每个奇数
        for(int i=0;i<odds.size();++i){
            //每一轮偶数都没用过
            vector<bool> used(evens.size(),false);
            //能否找到配对的偶数,且要最优
            if(find(odds[i],evens,used,match))
                count++;
        }
        cout<<count<<endl;
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

HJ29 字符串加解密

题目描述:
在这里插入图片描述

解题思路:
暴力解。
解法:

#include <iostream>
#include <string>

using namespace std;

int main() {
    // 加密,解密
    string str1,str2;
    cin>>str1>>str2;
    // 加密
    for(auto& str:str1){
        if (str>='a'&&str<'z') {
            str -=32-1;
        }
        else if(str == 'z'){
            str = 'A';
        }
        else if(str>='A'&&str<'Z'){
            str +=32+1;
        }
        else if (str == 'Z') {
            str = 'a';
        }
        else if(str>='0' && str<'9'){
            str += 1;
        }
        else if(str == '9')
            str = '0';
    }
    // 解密
    for(auto& str:str2){
        if (str>'a'&&str<='z') {
            str -=32+1;
        }
        else if(str == 'a'){
            str = 'Z';
        }
        else if(str>'A'&&str<='Z'){
            str +=32-1;
        }
        else if (str == 'A') {
            str = 'z';
        }
        else if(str>'0' && str<='9'){
            str -= 1;
        }
        else if(str == '0')
            str = '9';
    }
    cout<<str1<<endl<<str2;
}

HJ30 字符串合并处理

题目描述:
在这里插入图片描述
在这里插入图片描述

解题思路:
华为机试在线训练_字符串合并处理(字符串、排序)
解法:

#include <iostream>
#include <algorithm>
using namespace std;
//字符串合并处理的函数接口
void Process_String(string str1, string str2, string strOutput)
{
    //字典法:只考虑 '0' 到 '9' ,'a' 到 'f','A' 到 'F' 的字符即可,其余字符不做改变,照原输出
    char Intput[] = {"0123456789abcdefABCDEF"}; //输入参照字典(数字 + 大小写字母)
//    int Output[] = "084c2a6e195d3b7f5d3b7f"; //输出参照字典(小写)
    char Output[] = {"084C2A6E195D3B7F5D3B7F"}; //输出参照字典(数字 + 大写字母)
    strOutput = str1 + str2; //合并两个字符串
    string odd_str; //下标为奇数的字符组成的字符串,奇数位字符串
    string even_str; //下标为偶数的字符串组成的字符串,偶数位字符串
    //根据字符在合并字符串中的次序,按字典序分奇数位、偶数位独立来排,但次序的奇偶性不变,即原来是奇数位,排序后还是奇数位
    for (int i = 0; i < strOutput.size(); i++)
    {
        if (i % 2 == 0)
        {
            odd_str += strOutput[i];
        }
        else if (i % 2 == 1)
        {
            even_str += strOutput[i];
        }
    }
    sort(odd_str.begin(), odd_str.end()); //奇排序
    sort(even_str.begin(), even_str.end()); //偶排序
    //将按奇数位、偶数位排序后的字符再填回合并字符串 strOutput
    int j = 0; //奇数位字符串的下标
    int k = 0; //偶数位字符串的下标
    for (int i = 0; i < strOutput.size(); i++)
    {
        if (i % 2 == 0)
        {
            strOutput[i] = odd_str[j];
            j++;
        }
        else if (i % 2 == 1)
        {
            strOutput[i] = even_str[k];
            k++;
        }
    }
    //对字符(符合字典 Input[])所代表的 16 进制的数进行 BIT 倒序的操作,并转换为相应的大写字符
    for (int i = 0; i < strOutput.size(); i++)
    {
        if ((strOutput[i] >= '0') && (strOutput[i] <= '9'))
        {
            strOutput[i] = Output[strOutput[i] - '0'];
        }
        else if ((strOutput[i] >= 'a') && (strOutput[i] <= 'f'))
        {
            strOutput[i] = Output[strOutput[i] - 'a' + 10];
        }
        else if ((strOutput[i] >= 'A') && (strOutput[i] <= 'F'))
        {
            strOutput[i] = Output[strOutput[i] - 'A' + 16];
        }
    }
    cout << strOutput << endl;
    return;
}
//主函数
int main()
{
    string str1, str2, strOutput;
    while (cin >> str1 >>str2)
    {
        Process_String(str1, str2, strOutput);
    }
    return 0;
}

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

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

相关文章

如何对数据库的表字段加密解密处理?

对于表格数据的加密处理&#xff0c;通常涉及到对数据库中存储的数据进行加密&#xff0c;以保护敏感信息。 Java示例&#xff08;使用AES算法加密数据库表数据&#xff09; 首先&#xff0c;你需要一个数据库连接&#xff0c;这里假设你使用的是JDBC连接MySQL数据库。以下是…

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

SpringBoot 集成 Mybatis-Plus,LambdaQueryWrapper 使用方法

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是 一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &am…

新闻稿件管理:SpringBoot框架技术突破

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了新闻稿件管理系统的开发全过程。通过分析新闻稿件管理系统管理的不足&#xff0c;创建了一个计算机管理新闻稿件管理系统的方案。文章介绍了新闻稿件管理系统的系…

「Mac畅玩鸿蒙与硬件27」UI互动应用篇4 - 猫与灯的互动应用

本篇将带领你实现一个趣味十足的互动应用&#xff0c;用户点击按钮时猫会在一排灯之间移动&#xff0c;猫所在的位置灯会亮起&#xff08;on&#xff09;&#xff0c;其余灯会熄灭&#xff08;off&#xff09;。应用会根据用户的操作动态更新灯光状态和文本提示当前亮灯的位置&…

QGIS:HCMGIS插件

插件GitHub地址&#xff1a;https://github.com/thangqd/HCMGIS。 以下对HCMGIS插件进行简单介绍&#xff0c;并演示如何进行地图数据下载。 插件简介 HCMGIS - Basemaps, Download OpenData, Batch Converter, VN-2000 Projections, and Field Calculation Utilities for QGI…

什么情况下,不推荐建立索引?

一般有以下几种情况不推荐建立索引&#xff1a; 1&#xff09;对于数据量很小的表 当表的数据量很小&#xff08;如几百条记录&#xff09;时&#xff0c;建立索引并不会显著提高查询性能&#xff0c;反而可能增加管理的复杂性&#xff1b; 2&#xff09;频繁更新的表 对于…

Vue 组件基础(五)

一、Vue 组件的基础概念 组件(Component)是Vue最强大的功能之一。组件可以扩展HTML元素&#xff0c;封装可重用的代码。在较高层面上&#xff0c;组件是自定义元素&#xff0c;Vue的编译器为它添加特殊功能。每个组件负责一部分特定的任务&#xff0c;比如&#xff1a;显示一个…

Spring学习笔记(一)

一 、Spring概述 (一)Spring是什么 Spring是一个分层的Java SE/EE full-stack&#xff08;一站式&#xff09;轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse Of Control&#xff1a;反转控制&#xff09;和 AOP&#xff08;Aspect Oriented Programming&#xff1a;面…

数码身份与隐私保护挑战,未来监控社会如何应对?

内容概要 在这个数字化飞速发展的时代&#xff0c;数码身份如雨后春笋般涌现&#xff0c;似乎每个人都在网络的宇宙中拥有自己的“数字分身”。但随着这一现象的发展&#xff0c;隐私保护的挑战随之而来&#xff0c;就像一只藏在角落里的猫&#xff0c;随时可能蹦出来让你手足…

智慧商城项目-VUE2

实现效果 项目收获 通过本项目的练习&#xff0c;可以掌握以下内容&#xff1a; 创建项目 ##基本创建 基于 VueCli 自定义创建项目架子,并对相关的配置进行选择 vue create demo-shopping调整目录 删除文件 删除初始化的一些默认文件 src/assets/logo.pngsrc/components…

【Android】使用productFlavors构建多个变体

项目需求 在一个设备上安装两个一样的程序app 需求解决 我们知道每一个app都有一个包名的&#xff0c;如果一个app在Android设备上安装之后&#xff0c;再安装这个app的话会进行覆盖安装&#xff0c;因为他们两个的包名是一样的&#xff0c;默认是一个app。 但是我们现在需…

File和InputStream,OutputStream

目录 认识⽂件 树型结构组织 和 ⽬录 ⽂件路径&#xff08;Path&#xff09; 文件的种类 File类 属性 构造方法 方法 代码示例 文件内容的读写——数据流 java中提供了一组类表示流 1.字节流 2.字符流 InputStream概述 方法 说明 FileInputStream概述 构造方法…

docker镜像仓库实战

docker镜像仓库实战 搭建一个nginx服务基础知识(Web服务器)查找nginx镜像拉取镜像启动nginx镜像 搭建一个nginx服务 基础知识(Web服务器) Web 服务器&#xff0c;一般是指“网站服务器”&#xff0c;是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客…

[Redis] Redis主从复制模式

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

VisionPro —— CogPatInspectTool对比工具

一、CogPathInspectTool工具简介 CogPathInspectTool是VisionPro重要的工具&#xff0c;主要用于缺陷检测&#xff0c;通过将当前图像与“训练图像”对比&#xff0c;获取“原始差异图像”&#xff0c;再将“原始差异图像”与“阈值图像”进行对比&#xff0c;进而获取“阈值差…

Git 基础详解

1. 基本概念 Git是一个免费、开源的 分布式版本控制系统&#xff0c;可以高效处理小到大型的各种项目。 1.1 版本控制 版本控制&#xff1a;它是一种用于追踪和记录文件、目录、项目或软件的变化&#xff0c;以便将来查阅、比较、修订不同版本文件的系统 版本控制系统&…

博通网络交换芯片

参考视频&#xff1a;不懂网络芯片秒怂? 航家带你提逼格 | #1 博通Trident芯片系列_哔哩哔哩_bilibili

Java入门十三——继承(super)

大家好&#xff0c;今天怒更两篇hhhhh&#xff0c;干货满满&#xff01; 一、继承 今天我们要讲的内容是继承~这次我们依然拿动物举例&#xff01; 首先&#xff0c;我们创建了一个鸟类&#xff08;不是骂人啊&#xff0c;就是bird鸟类&#xff09; public class bird {publ…

操作系统学习笔记-3.1内存管理

文章目录 内存的地址绝对装入静态重定位动态重定位 链接覆盖和交换1. 覆盖&#xff08;Overwrite&#xff09;在内存管理中的作用2. 交换&#xff08;Swap&#xff09;在内存管理中的作用 连续分配管理方式固定分区分配的关键概念优点缺点示例动态分区分配的关键概念优点缺点示…