算法|牛客网华为机试11-20C++
牛客网华为机试
上篇:算法|牛客网华为机试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可购买的物品数量<60int N,m;cin>>N>>m;// 由于价格是10的整数倍,处理一下以降低空间/时间复杂度N/=10;// 二维表格存储全部初始化为价格0vector<vector<int>> prices(61,vector<int>(3,0)); // 价格// 二维表格存储全部初始化为价值0vector<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总钱数 全部初始化为0vector<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,数字不能超过255break;}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){ //掩码后半部分不能有1arr[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.255else 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;
}
相关文章:

算法|牛客网华为机试11-20C++
牛客网华为机试 上篇:算法|牛客网华为机试1-10C 文章目录 HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购物单HJ17 坐标移动HJ18 识别有效的IP地址和掩码并进行分类统计HJ19 简单错误记录HJ20 密码验证…...

OpenAI低调发布多智能体工具Swarm:让多个智能体协同工作!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...

性能之光 年度电竞性能旗舰iQOO 13发布
2024年10月30日,被定义为“性能之光”的年度电竞性能旗舰——iQOO 13正式发布,售价3999元起。iQOO 13作为iQOO 品牌在性能上的又一次深入探索,它像是一束光,引领行业不断拉高性能上限,让用户看到更多的可能性。 iQOO …...

如何避免因不熟悉数据保护法规而受损
在当今数字化时代,数据保护法规的遵守对于企业至关重要。不熟悉新的数据保护法规会导致法律风险增加、财务损失、声誉受损、客户信任下降等多方面的负面影响。其中,法律风险增加尤为严重,因为不符合规定可能引发高额罚款和法律诉讼。企业若未…...
LLaMA Factory 核心原理讲解
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

Java题集练习5
Java题集练习5(集合) 1.三种集合差别,集合类都是什么,数据结构是什么,都什么时候用 三者关系 Set集合 Set接口是Collection接口的一个子接口是无序的,set中不包含重复的元素,也就是说set中不…...

操作系统学习笔记-2.3哲学家和管程问题
哲学家问题 问题描述 假设有五位哲学家围坐在一张圆桌旁,每位哲学家面前放有一盘意大利面,他们各自间隔放置一根叉子。哲学家的行为分为“思考”和“进餐”两种状态。为了进餐,哲学家需要同时拿起左手边和右手边的两根叉子。用餐结束后&…...

2023年信息安全工程师摸底测试卷
目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …...
ReactOS系统中平衡二叉树。给定地址超导其所属区块MmFindRegion()
系列文章目录 PMM_REGION NTAPI MmFindRegion( PVOID BaseAddress, PLIST_ENTRY RegionListHead, PVOID Address, PVOID* RegionBaseAddress ); 宏函数 //给定地址找到其中所属区块 #define CONTAINING_RECORD(address,type,field) ((type FAR *\(PCHAR)(address)-(PCHAR)(&…...
基于TESSY的单元测试与分类树方法深入解析
在现代软件开发中,单元测试是确保软件质量和可靠性的关键步骤之一。特别是对于嵌入式软件,由于其应用环境的特殊性和高安全性要求,单元测试显得尤为重要。本文将基于《TESSY 用户手册》的内容,详细介绍如何使用TESSY 进行单元测试,并深入探讨分类树方法(Classification T…...

整理了一些大模型的课程,非常详细,大模型零基础入门到精通,收藏我这一篇就够了
目前有多个科普类的大模型课程,这些课程涵盖了从基础理论到实际应用的各个方面。以下是一些主要的科普类大模型课程:复旦大学“大模型开发与赋能”专题讲习班:由复旦大学计算机学院邱锡鹏教授带来的《大模型科普讲解》课程,通过深…...

区块链国赛题目--食品溯源(模块三)
区块链国赛题目–食品溯源(模块三) 任务 3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功 能完整性,示例页面如下: 具体要求如下: (1)有明…...

【Searxng】Searxng docker 安装
SearXNG将用户的查询请求分发至多个支持的搜索引擎,并收集返回的结果进行汇总处理。在这个过程中,它通过内置的过滤器功能屏蔽广告和其他不相关内容,确保搜索结果的纯净度。 一键部署 docker run \--name searxng \-p ????:8080 \-v ~/s…...
Java Lock/AQS ReentrantLock 源码
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & AQS & 目录》(持续更新)《Java & Lock/AQS & ReentrantLock & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Jav…...

魔法伤害--是谁偷走了我的0
起因:需要迁移数据进行数据更新,使用pandasorcal进行数据处理以及库迁移 首先把数据导出为xls格式数据文件,使用python import pandas as pdnew_obj pd.read_excel(ne,dtype{DAY: str, MONTH: str}) 原有导出数据格式为: 使用…...

【ArcGIS Pro实操第4期】绘制三维地图
【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达?在ArcGIS里可以使用ArcScene来实现,ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新,…...

Vuestic 整理使用
简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay,可以干活了,通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…...

学习伊圣雨老师的 epoll 编程
(1)书里提出了疑问,epoll 函数的工作方式,区分为水平触发与边缘触发 : (2) 谢谢...

详细了解C++11(1)
大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各…...
ITA的去锅盖处理流程
一、说明 锅盖是什么 锅盖的类型有哪些 二、去锅盖处理流程 去锅盖算法首先需要采集一份锅盖模板数据,该模板数据用户可以自定义保存,方便后面的开机重启直接导入使用。去锅盖处理包含两个历程:保存锅盖模板;去锅盖处理。 保存锅盖模板: ( 1 ) 打开采集锅盖模板开关。…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表
设计一个MySQL数据库和Clickhouse数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...