算法|牛客网华为机试11-20C++

news2024/11/6 17:22:46

牛客网华为机试

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

文章目录

  • HJ11 数字颠倒
  • HJ12 字符串反转
  • HJ13 句子逆序
  • HJ14 字符串排序
  • HJ15 求int型正整数在内存中存储时1的个数
  • HJ16 购物单
  • HJ17 坐标移动
  • HJ18 识别有效的IP地址和掩码并进行分类统计
  • HJ19 简单错误记录
  • HJ20 密码验证合格程序

HJ11 数字颠倒

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

解题思路:
如果为0直接输出,使用余数和除数自动省略小数点后特性,反向获取字符串并赋值给string。
解法:

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

int main() {
    int num;
    cin>>num;
    if (num == 0) {
        cout<<'0';
        return 0;
    }
    string output;
    while (num%10>0) {
        int one_num = num%10;
        num /= 10;
        output+=to_string(one_num);
    }
    cout<<output;
    return 0;
}

HJ12 字符串反转

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

解题思路:
直接用string索引值反向输出。
解法:

#include <iostream>
using namespace std;

int main() {
    string str;
    cin>>str;
    for(int i=str.size()-1;i>=0;--i)
    {
        cout<<str.at(i);
    }
    return 0;
}

HJ13 句子逆序

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

解题思路:
C++|string字符串操作(切割,是否包含某个子串)
获取一行数据;按空格将单个单词存入vector容器;字符串切割;将最后剩下的单词存入;反向输出;

解法:

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

int main() {
    string line;
    getline(cin,line);  // 获取一行数据
    vector<string> str_vec; // 按空格将单个单词存入vector容器
    // 字符串切割
    string::size_type comper = line.find(' ');
    while (comper<line.size()) {
        string a = line.substr(0,comper);
        str_vec.push_back(a);
        line = line.substr(comper+1,line.size());
        comper = line.find(' ');
    }
    // 将最后剩下的单词存入
    str_vec.push_back(line);
    // 反向输出
    for(int i=str_vec.size()-1;i>=0;--i)
    {
        cout<<str_vec.at(i)<<' ';
    }
    return 0;
}

HJ14 字符串排序

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

解题思路:
C++|sort函数
直接使用sort函数排序;
或者使用冒泡法;
解法:
sort

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

int main() {
    int n;
    cin>>n;
    vector<string> str_vec;
    string str;
    for(int i=0;i<n;++i)
    {
        cin>>str;
        str_vec.push_back(str);
    }
    sort(str_vec.begin(),str_vec.end());
    for (auto out:str_vec) {
        cout<<out<<endl;
    }
    return 0;
}

冒泡法:

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

int main() {
    int n;
    cin>>n;
    vector<string> str_vec;
    string str;
    for(int i=0;i<n;++i)
    {
        cin>>str;
        str_vec.push_back(str);
    }
    for(int i=0;i<str_vec.size();++i){
        for(int j=1;j<str_vec.size();++j){
            if (str_vec[j-1]>str_vec[j]) {
                swap(str_vec[j-1],str_vec[j]);
            }
        }
    }
    for (auto out:str_vec) {
        cout<<out<<endl;
    }
    return 0;
}

HJ15 求int型正整数在内存中存储时1的个数

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

解题思路:
C++|bitset模板类
直接利用C++的bitset模板类,详见上方链接;
解法:

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

int main() {
    int n;
    cin>>n;
    bitset<32> b(n);
    cout<<b.count();
}

HJ16 购物单

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

解题思路:
尽力了实在不擅长动态规划问题;
解法:

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

int main() {
    // N总钱数<32000,m可购买的物品数量<60
    int N,m;
    cin>>N>>m;
    // 由于价格是10的整数倍,处理一下以降低空间/时间复杂度
    N/=10;
    // 二维表格存储全部初始化为价格0
    vector<vector<int>> prices(61,vector<int>(3,0));    // 价格
    // 二维表格存储全部初始化为价值0
    vector<vector<int>> pricesMultiplyPriority(61,vector<int>(3,0));// 价值 重要程度
    // 最多可购买m个物品
    for(int i = 1;i <= m; ++i){
        int a,b,c;
        cin>>a>>b>>c; // 价格 价值 附属谁
        a/=10;b*=a;   // 单个物品价格同样除以10 计算价值
        if(c == 0){ // 如果是主件
            prices[i][0] = a;   // 赋值价格
            pricesMultiplyPriority[i][0] = b; // 赋值价值
        }
        else{
            // c 和 i 为相对的 如果是第一个附属物
            if (prices[c][1] == 0) {
                prices[c][1] = a;
                pricesMultiplyPriority[c][1] = b;
            }else{ // c 和 i 为相对的 如果是第二个附属物
                prices[c][2] = a;
                pricesMultiplyPriority[c][2] = b;
            } 
        }
    }
    // 使用分组背包 m可购买物品数量 N总钱数 全部初始化为0
    vector<vector<int>> dp(m+1,vector<int>(N+1,0));
    // 最多可购买m个物品
    for(int i=1;i<=m;++i){
        // 钱没花完一直循环
        for(int j=1;j<=N;++j){
            // 主件 价钱 价值
            int a = prices[i][0],b = pricesMultiplyPriority[i][0];
            // 附件1 价钱 价值
            int c = prices[i][1],d = pricesMultiplyPriority[i][1];
            // 附件2 价钱 价值
            int e = prices[i][2],f = pricesMultiplyPriority[i][2];
            dp[i][j] = j >= a ? max(dp[i-1][j-a]+b, dp[i-1][j]) : dp[i-1][j];
            dp[i][j] = j >= (a+c) ? max(dp[i-1][j-a-c]+b+d,dp[i][j]):dp[i][j];
            dp[i][j] = j >= (a+e) ? max(dp[i-1][j-a-e]+b+f,dp[i][j]):dp[i][j];
            dp[i][j] = j >= (a+c+e) ? max(dp[i-1][j-a-c-e]+b+d+f,dp[i][j]):dp[i][j];
        }
    }
    cout<<dp[m][N]*10<<endl;
}

HJ17 坐标移动

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

解题思路:
C++|string字符串操作(切割,是否包含某个子串)

解法:

#include <iostream>
#include <string>
#include <cctype> // for std::isdigit
using namespace std;
// 判断是否为正整数
bool isPositiveInteger(const std::string& str) {
    if (str.empty() || (!std::isdigit(str[0]) && str[0] != '-')) {
        return false;
    }

    // 遍历字符串中的每个字符
    for (char c : str) {
        if (!std::isdigit(c)) {
            // 如果遇到非数字字符,则不是正整数
            return false;
        }
    }

    // 如果字符串不为空,并且所有字符都是数字,则可能是正整数
    // 但是,我们还需要确保它不是负数
    int startIndex = 0;
    if (str[0] == '-') {
        // 如果字符串以负号开头,则不是正整数
        return false;
    }

    // 如果通过了上述所有检查,那么这个字符串是一个正整数
    return true;
}

int main() {
    string str;
    cin>>str;
    int x = 0,y = 0;
    while (str.size()>0) {
        // 切割字符串
        string::size_type comper = str.find(";");
        string one = str.substr(0, comper);
        str = str.substr(comper+1, str.size());
        // 如果小于1肯定不是合法字段
        if(comper<=1)
            continue;
        // 切割方向
        string direction = one.substr(0,1);
        // 切割距离
        one = one.substr(1, one.size());
        // 如果方向正确
        if(direction == "A"||direction == "D"||direction == "W"||direction == "S")
        {
            // 判断距离是否为正整数
            if(isPositiveInteger(one))
            {
                // 移动
                if(direction == "A")
                    x -= stoi(one);
                else if(direction == "D")
                    x += stoi(one);
                else if(direction == "W")
                    y += stoi(one);
                else if(direction == "S")
                    y -= stoi(one);
            }
        }
    }
    cout<<x<<","<<y;
}

HJ18 识别有效的IP地址和掩码并进行分类统计

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

解题思路:
题解 | #识别有效的IP地址和掩码并进行分类统计#

解法:

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

int main(){
    vector<int> arr(7, 0); //分别对应题目的7个类别
    string s;
    while(getline(cin, s)){
        int n = s.length();
        vector<int> ips; //记录ip地址的数字
        bool bad = false;
        bool isnum = false;
        int num = 0;
        for(int i = 0; i < n; i++){ //遍历该ip字符串
            if(s[i] == '.' || s[i] == '~'){ //以.或者~分割
                if(isnum){
                    if(num > 255){
                        bad = true; //错误ip,数字不能超过255
                        break;
                    }
                    ips.push_back(num);
                    isnum = false;
                    num = 0;
                }else{
                    arr[5]++; //错误地址
                    bad = true;
                    break;
                }
            }else if(s[i] >= '0' && s[i] <= '9'){
                isnum = true;
                num = num * 10 + s[i] - '0'; //计算数字
            }else{
                arr[5]++;
                isnum = false; //错误地址,数字部分还有非数字
                bad = true;
                break;
            }
        }
        if(isnum)
            ips.push_back(num); //最后一个数字
        if(ips[0] == 0 || ips[0] == 127 || bad) 
            continue; //忽略0或者127开头的地址,错误ip已经统计了过了,可以忽略
        int mask = 4; //查看掩码的数字
        while(mask < 8 && ips[mask] == 255)
            mask++;  //找到掩码第一个不全为1的数
        if(mask == 8){ //掩码全1也是不合法
            arr[5]++;
            continue; 
        }else if(ips[mask] == 254 || ips[mask] == 252 || ips[mask] == 248 || ips[mask] == 240 || ips[mask] == 224 || ips[mask] == 191 || ips[mask] == 128)
            mask++; //各类掩码含1的最后一位
        while(mask < 8 && ips[mask] == 0)
            mask++;
        if(mask != 8){ //掩码后半部分不能有1
            arr[5]++;
            continue;
        }
        if(ips[0] >= 1 && ips[0] <= 126)
            arr[0]++; //A类地址
        else if(ips[0] >= 128 && ips[0] <= 191) 
            arr[1]++; //B类地址
        else if(ips[0] >= 192 && ips[0] <= 223) 
            arr[2]++; //C类地址
        else if(ips[0] >= 224 && ips[0] <= 239) 
            arr[3]++; //D类地址
        else if(ips[0] >= 240 && ips[0] <= 255) 
            arr[4]++; //E类地址
        if(ips[0] == 10) 
            arr[6]++; //私有地址10开头的
        else if(ips[0] == 172 && (ips[1] >= 16 && ips[1] <= 31)) 
            arr[6]++; //私有地址172.16.0.0-172.31.255.255
        else if(ips[0] == 192 && ips[1] == 168) 
            arr[6]++; //私有地址192.168.0.0-192.168.255.255
    }
    for(int i = 0; i < 7; i++){ //输出
        cout << arr[i];
        if(i != 6)
           cout << " ";
    }
    cout << endl;
    return 0;
}

HJ19 简单错误记录

题目描述:
在这里插入图片描述
在这里插入图片描述
解题思路:
用map加deque
解法:

#include <iostream>
#include <string>
#include <deque>
#include <map>
using namespace std;
int main() {
    string str;
    map<string, int> result;
    deque<string> deq;
    while (getline(cin, str)) {
        str = str.substr(str.find_last_of('\\') + 1);
        int pos = str.find_last_of(' ');
        if ( pos > 16) {
            str = str.substr(pos - 16);
        }

        if (result.find(str) == result.end()) deq.push_back(str);
        ++result[str];
        if (deq.size() > 8) deq.pop_front();
    }
    for (auto x : deq) {
        cout << x << " " << result[x] << endl;
    }
    return 0;
}

HJ20 密码验证合格程序

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

解题思路:
HJ20.密码验证合格程序
解法:

#include <iostream>
#include <string>
#include <unordered_set>

const std::string OK = "OK";
const std::string NG = "NG";

bool check1(const std::string& s) {
    return s.length() > 8;
}

bool check2(const std::string& s) {
    int type[4] = {0, 0, 0, 0};
    for (auto& i : s) {
        if (i == ' ' || i == '\n') {
            return false;
        }
        if (i >= 'A' && i <= 'Z') {
            type[0] = 1;
        }else if (i >= 'a' && i <= 'z') {
            type[1] = 1;
        }else if (i >= '0' && i <= '9') {
            type[2] = 1;
        }else {
            type[3] = 1;
        }
    }
    if (type[0] + type[1] + type[2] + type[3] < 3) {
        return false;
    }
    return true;
}

bool check3(const std::string& s) {
    std::unordered_set<std::string> sets;
    std::string tmp;
    for (int i = 0; i < s.length() - 2; ++i) {
        tmp = s.substr(i, 3);
        if (sets.find(tmp) == sets.end()) {
            sets.insert(tmp);
        }else {
            return false;
        }
    }
    return true;
}

int main() {
    std::string in;
    while (getline(std::cin, in)) {
        if (check1(in) && check2(in) && check3(in)) {
            std::cout << OK << '\n';
        }else {
            std::cout << NG << '\n';
        }
    }
    return 0;
}

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

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

相关文章

Pandas DataFrame学习补充

1. 从字典创建&#xff1a;字典的键成为列名&#xff0c;值成为列数据。 import pandas as pd# 通过字典创建 DataFrame df pd.DataFrame({Column1: [1, 2, 3], Column2: [4, 5, 6]}) 2. 从列表的列表创建&#xff1a;外层列表代表行&#xff0c;内层列表代表列。 df pd.Da…

剖析高精度、直线电机技术八大常见问题你了解吗?

在现代工业自动化和机械工程的快速发展背景下&#xff0c;高精度直线电机技术逐渐崭露头角&#xff0c;成为推动各类高端设备和系统的重要力量。直线电机以其独特的工作原理和优越的性能特点&#xff0c;广泛应用于数控机床、自动化生产线、机器人等领域。 一、什么是高精度直线…

如何解决RabbitMQ消息的重复消费问题

什么情况下会导致消息的重复消费——在消费者还没成功发送自动确认机制时发生&#xff1a; 网络抖动消费者挂了 解决方案 每条消息设置一个唯一的标识id幂等方案&#xff1a;【Redis分布式锁、数据库锁&#xff08;悲观锁、乐观锁&#xff09;】 面试官&#xff1a;如何解决…

jade 0919 | 提取自TVBox的直播盒子,频道丰富高清

jade电视直播app覆盖央视全频道和各大卫视&#xff0c;各地地方台也能一网打尽&#xff0c;随时随地看高清电视。各卫视台覆盖广泛&#xff0c;包括浙江电视台、湖南卫视、江苏卫视、东方卫视等全部卫视台&#xff0c;最新内容先一步掌握。拥有广东、北京、风云足球等热播体育频…

书生大模型实战营第四期-入门岛第一关

关卡任务 好的&#xff0c;我们废话不多说&#xff0c;开始闯关Go,Go,Go! 闯关任务 SSH连接到本地使用开发机是很舒服的&#xff0c;但是我们该如何连接呢&#xff0c;别急&#xff0c;书生给我们教程了 这里我们展示结果&#xff0c;对了&#xff0c;本地SSH连接需要安装一些…

臻于智境 安全护航 亚信安全受邀出席新华三智算新品发布会

近日&#xff0c;紫光股份旗下新华三集团在北京隆重举办了主题为“乘势 进化 臻于智境”的新华三智算新品发布会。作为新华三集团的长期战略合作伙伴&#xff0c;亚信安全受邀参会&#xff0c;亚信安全CEO马红军出席发布仪式&#xff0c;并与来自各界的业界伙伴共同探讨智能化…

错题收集app有哪些?5个软件帮助你快速进行app收集

错题收集app有哪些&#xff1f;5个软件帮助你快速进行app收集 以下是五款便捷实用的错题收集 App&#xff0c;能够帮助你更高效地记录、整理和复习错题&#xff1a; 试卷全能宝 试卷全能宝 是一款多功能试卷识别和编辑软件&#xff0c;适合用于错题整理和记录。你可以创建错…

GitGraphPro 图管理系统

1.产品介绍 产品介绍方案 产品名称: GitGraphPro 图管理系统 主要功能: 智能图谱构建版本控制与协作数据分析与可视化自定义模板与导出功能介绍: 1. 智能图谱构建 具体作用:GitGraphPro 利用先进的算法,自动从项目数据

flask框架用法介绍(一)

flask框架用法介绍(一) 一、创建flask项目二、创建模板以及简单的前后端数据传递三、在模板中使用条件判断和循环3.1 条件判断3.2 for循环四、模板继承一、创建flask项目 项目框架如下: app.py内容如下: from flask import Flaskapp = Flask(__name__)@app.route("…

[免费]SpringBoot+Vue学生成绩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue学生成绩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue学生成绩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机互联网技术的不断发展&#xff0c;不断…

接口测试(九)jmeter——关联(JSON提取器)

一、JSON提取器介绍 要检查的响应字段&#xff1a;样本数据源引用名称&#xff1a;可自定义设置引用方法&#xff1a;${引用变量名}匹配数字 匹配数字含义-1表示全部0随机1第一个2第二个…以此类推 缺省值&#xff1a;匹配失败时的默认值ERROR&#xff0c;可以不写 二、js…

【MyBatis源码】SqlSessionFactoryBuilder源码分析

文章目录 概述类结构从 InputStream 创建 SqlSessionFactoryXMLConfigBuilder构建ConfigurationXMLConfigBuilder初始化方法parse()方法parseConfiguration属性&#xff08;properties&#xff09; 概述 SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;提供创建 Sql…

鸿蒙原生应用开发及部署:首选华为云,开启HarmonyOS NEXT App新纪元

目录 前言 HarmonyOS NEXT&#xff1a;下一代操作系统的愿景 1、核心特性和优势 2、如何推动应用生态的发展 3、对开发者和用户的影响 华为云服务在鸿蒙原生应用开发中的作用 1、华为云ECS C系列实例 &#xff08;1&#xff09;全维度性能升级 &#xff08;2&#xff…

SQLite3库增删改查实现数据管理

1. SQLite3简介 SQLite3是一个轻量级的、嵌入式的关系型数据库管理系统&#xff0c;在保存测序数据或结果等时可使用&#xff0c;简单高效&#xff0c;并且有无需服务器、单文件存储数据、支持标准SQL、支持跨平台等优势。 本文以Sqlite3数据库为基础&#xff0c;创建代码示例…

【实验八】前馈神经网络(4)优化问题

1 参数初始化 模型构建 模型训练 优化 完整代码 2 梯度消失问题 模型构建 模型训练 完整代码 3 死亡Relu问题 模型构建 模型训练 优化 完整代码 1 参数初始化 实现一个神经网络前&#xff0c;需要先初始化模型参数。如果对每一层的权重和偏置都用0初始化&#xff0…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行&#x1f47a;code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)&#x1f60a;使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

【秋冬进补】灵芝玉叶膏冬令上选减补两不误

秋冬季不仅是进补季&#xff0c;也是肥胖增涨的季节&#xff0c;气温降低了&#xff0c;运动、户外活动量减少了&#xff0c;消耗吸收率减慢&#xff0c;饮食中肉类比例上升&#xff0c;绿蔬少了&#xff0c;油热量增加了&#xff0c;肥胖几率也一样增加了。因此&#xff0c;选…

HTML5 + CSS3 + JavaScript 编程语言学习教程

HTML5 CSS3 JavaScript 编程语言学习教程 欢迎来到这篇关于 HTML5、CSS3 和 JavaScript 的详细学习教程&#xff01;无论你是初学者还是有一定基础的开发者&#xff0c;这篇文章都将帮助你深入理解这三种技术的核心概念、语法和应用。 目录 HTML5 1.1 HTML5 简介1.2 HTML5 …

10月第4周AI资讯

阅读时间&#xff1a;3-4min 更新时间&#xff1a;2024.10.21-2024.10.25 目录 CoI-Agent&#xff1a;一键生成科研idea的AI研究助手 波兰电台正式启用 AI 主播 Claude可以像人类一样使用计算机 简单文本即可创建个性化语音 AI音乐制作工具新突破 CoI-Agent&#xff1a;…