算法|牛客网华为机试41-52C++

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

文章目录

  • HJ41 称砝码
  • HJ42 学英语
  • HJ43 迷宫问题
  • HJ44 Sudoku
  • HJ45 名字的漂亮度
  • HJ46 截取字符串
  • HJ48 从单向链表中删除指定值的节点
  • HJ50 四则运算
  • HJ51 输出单向链表中倒数第k个结点
  • HJ52 计算字符串的编辑距离

HJ41 称砝码

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

解题思路:
题解 | #称砝码#
解法:

#include<iostream>
#include<vector>
#include<unordered_set>
#include<algorithm>
using namespace std;int main(){int n;while(cin >> n){vector<int> weight(n);vector<int> num(n);for(int i = 0; i < n; i++) //输入n种砝码重量cin >> weight[i];for(int i = 0; i < n; i++) //输入n种砝码的数量cin >> num[i];unordered_set<int> s; //集合用于去重s.insert(0); //0也是一种for(int i = 0; i < n; i++){ //对于每一种砝码for(int j = 1; j <= num[i]; j++){ //用完之前数量之前unordered_set<int> temp(s);for(auto iter = temp.begin(); iter != temp.end(); iter++) //当前集合每个都可以加一次s.insert(*iter + weight[i]);}}cout << s.size() << endl; //最后集合的大小就是种类}return 0;
}

HJ42 学英语

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

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

#include<bits/stdc++.h> // 包含C++标准库的所有头文件
using namespace std; // 使用标准命名空间// 数组,用于存储1到9的英文单词
string ones[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };// 数组,用于存储10到19的英文单词
string tens[] = { "ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen" };// 数组,用于存储20到90的英文单词(每十个一组)
string twenties[] = { "zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety" };// 数组,用于存储"hundred", "thousand", "million", "billion"等单位的英文单词
string hundreds[] = { "hundred", "thousand", "million", "billion" };// 数组,用于存储与hundreds数组中单位对应的数值
int ihundreds[] = { (int)1e2, (int)1e3, (int)1e6, (int)1e9, (int)1e12 };// 函数,将整数n转换为英文单词表示
string itoe(long long n)
{// 如果n小于等于9,直接返回ones数组中对应的单词if (n<=9)return ones[n];// 如果n小于20,返回tens数组中对应的单词else if (n<20)return tens[n%10];// 如果n小于100,返回twenties数组中对应的单词,并根据个位数是否为0来决定是否添加个位数的单词else if (n<1e2)return twenties[n/10] + (n%10 ? " " + ones[n%10] : "");// 对于更大的数字,使用递归else {for (int i=0; i < 4; i++)// 找到当前数字所在的数量级if (n < ihundreds[i+1])// 递归调用itoe函数,并将结果与当前数量级的单位组合起来return itoe(n/ihundreds[i]) + " " + hundreds[i] // 如果不是最高数量级,并且当前数量级不为0,则添加"and"和当前数量级的数字+ (n%ihundreds[i] ? (i ? " ": " and ") + itoe(n%ihundreds[i]) : "");}return ""; // 如果数字为0,返回空字符串
}int main()
{long long n; // 用于存储输入的整数// 循环读取输入的整数,并输出其英文单词表示while (cin>>n)cout<<itoe(n)<<endl;
}

HJ43 迷宫问题

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

解题思路:
题解 | #迷宫问题#
“深度优先搜索一定要对递归过程有深入的理解,这样才能越做越顺,初做此类题型时不要盲目追求做题速度,多画一画递归树,了解了DFS运行机制以后,再去做同类题型就会得心应手。”
我讨厌动态规划。
解法:

#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<vector<int>> maze;
//当从(0,0)到(n-1,m-1)有多条通路时,best_path记录最小的temp_path
//本题只有一条通路,所以当到达(n-1,m-1)时,让 best_path=temp_path即可
vector<vector<int>> best_path;
vector<vector<int>> temp_path;void dfs(int i,int j){// 边界条件:(1)数组越界(2)“墙壁”或已走过if(i<0||i>=n||j<0||j>=m||maze[i][j]==1){return;}maze[i][j] = 1; //该位置已走过标记为1temp_path.push_back({i,j});if(i == n-1 && j == m-1){//走到终点// 多条路径时best_path记录最小的temp_path//if(temp_path.size()<best_path.size()||best_path.empty()){//    best_path = temp_path;//}// 本题只有一条通路,所以当到达(n-1,m-1)时,让best_path=temp_path即可best_path = temp_path;}dfs(i-1, j);//上dfs(i+1, j);//下dfs(i,j-1);//左dfs(i,j+1);//右maze[i][j]=0;//该结点走不通时,恢复原场面temp_path.pop_back();//从路径中删除节点
}int main() {while (cin>>n>>m) {maze = vector<vector<int>> (n,vector<int>(m,0));//设置地图大小并初始化//一次测试中多个案例一次输入时,每个案例执行完后将路径容器清空best_path.clear();temp_path.clear();for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>maze[i][j];}}dfs(0, 0);for(auto iter = best_path.begin();iter!=best_path.end();iter++)cout<<"("<<(*iter)[0]<<","<<(*iter)[1]<<")"<<endl;return 0;}
}

HJ44 Sudoku

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

解题思路:
题解 | #Sudoku#
解法:

#include <iostream>
using namespace std;
int num[9][9];  //用于保存9x9盘面
bool flag = false;//flag为true时表示推算完成,结束递归bool check(int n){  //判断当前位置的值是否满足条件int h = n / 9;  //行号int l = n % 9;  //列号for(int i=0;i<9;++i){//同一列中不能有重复if(i != h && num[i][l] == num[h][l]){return false;}}for(int j=0;j<9;++j){//同一行中不能有重复if( j != l && num[h][j] == num[h][l]){return false;}}for (int i = h / 3 * 3; i < h / 3 * 3 + 3; ++i) {//九宫格内不重复for(int j = l / 3 * 3;j < l / 3 * 3 + 3;++j){if((i != h || j != l) && num[i][j] == num[h][l]){return false;}}}return true;
}void dfs(int n){if(n == 81){//如果已经递归到右下角,输出整个盘面,并置flag为true,结束递归for(int i = 0;i < 9;++i){for(int j = 0;j < 8;++j){cout<<num[i][j]<<' ';}cout<<num[i][8]<<endl;}flag = true;return;}int h = n / 9;//行号int l = n % 9;//列号if(num[h][l] == 0){//如果当前位置为0,说明需要推算for(int i = 1;i <= 9;++i){//枚举1-9的数字,判断哪个满足条件num[h][l] = i;if(check(n)){   //判断当前数字是否满足条件dfs(n+1);   //如果满足条件继续往下递归if(flag){//如果flag为true表示整个盘面的递归结束了return;}}}num[h][l] = 0;//需要回溯,恢复num[h][l]的值为0}else{  // 当前位置不为0,往下一格递归dfs(n+1);}
}int main() {for (int i = 0; i< 9; ++i) {for (int j = 0; j < 9; ++j) {cin>>num[i][j];//输入9x9盘面}}dfs(0);//从左上角开始递归return 0;
}

HJ45 名字的漂亮度

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

解题思路:
题目的意思就是找出字符串出现次数最多的字母,从26开始赋值,依次递减,出现次数第二多的为25…最后计算漂亮度总和最高的。
解法:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {int d;while (cin >> d) {while (d--) {string s;cin >> s;// 初始化值为0的26个元素的动态数组 表示a-z出现的此时对应0-25vector<int>arr(26, 0);// 遍历每个字母for (int i = 0; i < s.size(); i++) {// 如果是小写字母减去a ++表示出现过的次数大写字母同理if (s[i] >= 'a' && s[i] <= 'z') {arr[s[i] - 'a']++;} else if (s[i] >= 'A' && s[i] <= 'Z') {arr[s[i] - 'A']++;}}// 根据出现过的次数从小到大排序sort(arr.begin(), arr.end());int res = 0;int k = 26;// 从出现次数最多的字母开始输出for (int i = 25; i >= 0; i--) {res += arr[i] * k;k--;}cout << res << endl;}}return 0;
}

HJ46 截取字符串

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

解题思路:
C++|string字符串操作(切割,是否包含某个子串)
string的substr()函数可以截取制定位置字符串。
解法:

#include <iostream>
using namespace std;int main() {string str;cin>>str;int num;cin>>num;cout<<str.substr(0,num);
}

HJ48 从单向链表中删除指定值的节点

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

解题思路:
用数组模拟链表。
解法:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n,head;while (cin>>n>>head) {vector<int> array;//用数组模拟链表array.push_back(head);//现将头元素放入for(int i=1;i<n;++i){//放入除头元素外其他元素int num,pos_num;//要插入的数和它要插入哪个数字后面cin>>num>>pos_num;  auto iter = find(array.begin(),array.end(),pos_num);//找到要插入后面的位置if(iter == array.end()) //结尾push_backarray.push_back(num);else//中间insertarray.insert(iter+1,num);}int remove;cin>>remove;array.erase(find(array.begin(),array.end(),remove));//找到要移除的数字的位置for(int i=0;i<array.size();++i){//输出cout<<array[i]<<" ";}}return 0;
}

HJ50 四则运算

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

解题思路:
题解 | #四则运算#
解法:

#include <iostream>
#include <string>
#include <vector>
using namespace std;int compute(string&s,int left,int right){char op = '+';//默认加开始 如果数字是-的后面单独处理int num = 0;vector<int> st;for(int i = left; i <= right; ++i){if(isdigit(s[i]))//数字num = num * 10 + s[i] - '0';//计算该部分数字总和 如果数字大于9else if (s[i] == '{' || s[i] == '[' || s[i] == '('){//进入左括号int layer = 0;//统计左括号层数int j = i;while(j <= right){//遍历到右边if(s[j] == '{' || s[j] == '[' || s[j] == '('){layer++;//遇到左括号层数累加}else if(s[j] == '}' || s[j] == ']' || s[j] == ')'){layer--;//遇到右括号层数递减if(layer == 0)//直到层数为0break;}j++;}num = compute(s,i+1,j-1);//递归计算括号中的部分i = j+1;}if(!isdigit(s[i]) || i == right){//遇到运算符或结尾switch(op){//根据运算符开始计算case '+':st.push_back(num); break;//加减法加入末尾case '-':st.push_back(-num); break;case '*':st.back()*=num; break;//乘除法与末尾计算case '/':st.back()/=num; break;}op = s[i];//修改为下一次的运算符num = 0;}}int res = 0;for (int x:st) {//累加和res+=x;}return res;
}int main() {string str;while (cin>>str) {cout<<compute(str, 0, str.length()-1);}return 0;
}

俺也不知道47、49去哪了,写着写着就没了,就像很多公司让等着等着就没信了。。。

HJ51 输出单向链表中倒数第k个结点

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

解题思路:
题解 | #输出单向链表中倒数第k个结点#
解法:

#include<iostream>
using namespace std;struct ListNode{ //链表结点int val;ListNode* next;ListNode(int x) : val(x), next(NULL){} //初始化
};
ListNode* FindKthToTail(ListNode* pHead, int k, int n) { //找到链表倒数第k个结点ListNode* p = pHead;if(n < k) //长度过小,返回空链表return p = NULL;for(int i = 0; i < n - k; i++) //遍历n-k次p = p->next;return p;
}int main(){int n;while(cin >> n){ //输入nint val;cin >> val;ListNode *head = new ListNode(val); //链表第一个结点ListNode *p = head;for(int i = 1; i < n; i++){ //输入链表后续结点cin >> val;ListNode *q = new ListNode(val);p->next = q; //连接p = p->next;}int k;cin >> k; //输入kif(k == 0) //k等于0直接输出0cout << 0 << endl;else{p = FindKthToTail(head, k, n); //找到第k个结点if(p != NULL) //返回不为null才能输出cout << p->val << endl;}}return 0;
}

HJ52 计算字符串的编辑距离

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

解题思路:
题解 | #计算字符串的距离#
解法:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>using namespace std;int main() {string str1, str2;while (cin >> str1 >> str2) {vector<vector<int>> dp(str1.size() + 1, vector<int>(str2.size() + 1, 0));for (int i = 1; i <= str2.size(); i++) dp[0][i] = i;//str1从0个字符变成str2的i个字符需要i个插入操作for (int i = 1; i <= str1.size(); i++) dp[i][0] = i;//str1从i个字符变成str2的0个字符也需要i个删除操作for(int i=1;i<=str1.size();i++){for (int j = 1; j <= str2.size(); j++) {int op1 = dp[i-1][j] + 1;//删除字符str1[i-1]int op2 = dp[i][j-1] + 1;//删除字符str2[j-1]int op3 = dp[i-1][j-1];//替换操作if(str1[i-1] != str2[j-1]){op3++;}dp[i][j] = min(min(op1, op2), op3);//替换操作和删除操作取最小}}cout << dp[str1.size()][str2.size()] << endl;}
}

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

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

相关文章

粒子群优化双向深度学习!PSO-BiTCN-BiGRU-Attention多输入单输出回归预测

粒子群优化双向深度学习&#xff01;PSO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 粒子群优化双向深度学习&#xff01;PSO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-BiTCN-BiGRU-Attention粒子…

「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建

本篇详细介绍在Mac系统上快速搭建Cangjie开发环境的步骤&#xff0c;涵盖VSCode的下载与安装、Cangjie插件的离线安装、工具链的配置及验证。通过这些步骤&#xff0c;确保开发环境配置完成&#xff0c;为Cangjie项目开发提供稳定的基础支持。 关键词 Cangjie开发环境搭建VSC…

协程6 --- HOOK

文章目录 HOOK 概述链接运行时动态链接 linux上的常见HOOK方式修改函数指针用户态动态库拦截getpidmalloc 第一版malloc 第二版malloc/free通过指针获取到空间大小malloc 第三版strncmp 内核态系统调用拦截堆栈式文件系统 协程的HOOK HOOK 概述 原理&#xff1a;修改符号指向 …

ResNet 残差网络 (乘法→加法的思想 - 残差连接是所有前沿模型的标配) + 代码实现 ——笔记2.16《动手学深度学习》

目录 前言 0. 乘法变加法的思想 1. 函数类 2. 残差块 (讲解代码) QA: 残差这个概念的体现&#xff1f; 3. ResNet模型 (代码讲解) 补充&#xff1a;更多版本的ResNet 4. 训练模型 5. 小结 6. ResNet的两大卖点 6.1 加深模型可以退化为浅层模型 6.2 用加法解决梯度消…

iphone怎么删除重复的照片的新策略

Phone用户常常面临存储空间不足的问题&#xff0c;其中一个主要原因是相册中的重复照片。这些重复项不仅占用了大量的存储空间&#xff0c;还会影响设备的整体性能。本文将向您展示iphone怎么删除重复的照片的方法&#xff0c;包括一些利用工具来自动化这个过程的创新方法。 识…

软件缺陷等级评定综述

1. 前言 正确评估软件缺陷等级&#xff0c;在项目的生命周期中有着重要的作用&#xff1a; 指导缺陷修复的优先级和资源分配 在软件开发和维护过程中&#xff0c;资源&#xff08;包括人力、时间和资金&#xff09;是有限的。通过明确缺陷的危险等级&#xff0c;可以帮助团队合…

【Pikachu】Cross-Site Scripting跨站脚本攻击实战

只管把目标定在高峰&#xff0c;人家要笑就让他去笑&#xff01; 1.XSS&#xff08;跨站脚本&#xff09;概述 XSS&#xff08;跨站脚本&#xff09;概述 Cross-Site Scripting 简称为“CSS”&#xff0c;为避免与前端叠成样式表的缩写"CSS"冲突&#xff0c;故又称…

【SpringBoot】 黑马大事件笔记-day2

目录 用户部分 实体类属性的参数校验 更新用户密码 文章部分 规定josn日期输出格式 分组校验 上期回顾&#xff1a;【SpringBoot】 黑马大事件笔记-day1 用户部分 实体类属性的参数校验 对应的接口文档&#xff1a; 基本信息 请求路径&#xff1a;/user/update 请求方式&#…

大数据面试题--kafka夺命连环问

1、kafka消息发送的流程&#xff1f; 在消息发送过程中涉及到两个线程&#xff1a;一个是 main 线程和一个 sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给双端队列&#xff0c;sender 线程不断从双端队列 RecordAccumulator 中拉取…

QT信号和槽与自定义的信号和槽

QT信号和槽与自定义的信号和槽 1.概述 这篇文章介绍下QT信号和槽的入门知识&#xff0c;通过一个案例介绍如何创建信号和槽&#xff0c;并调用他们。 2.信号和槽使用 下面通过点击按钮关闭窗口的案例介绍如何使用信号和槽。 创建按钮 在widget.cpp文件中创建按钮代码如下 …

unity显示获取 年月日周几【日期】

unity显示获取 年月日周几【日期】 public void ShowDate(Text txt){//txt.text DateTime now DateTime.Now; // 获取当前时间int year now.Year; // 获取年份int month now.Month; // 获取月份&#xff08;1-12&#xff09;int day now.Day; // 获取天数&#xff08;1-31&…

emr上使用sparkrunner运行beam数据流水线

参考资料 https://time.geekbang.org/column/intro/167?tabcatalog Apache Beam和其他开源项目不太一样&#xff0c;它并不是一个数据处理平台&#xff0c;本身也无法对数据进行处理。Beam所提供的是一个统一的编程模型思想&#xff0c;而我们可以通过这个统一出来的接口来编…

AUTOSAR CP SocketAdaptor(SoAd)规范导读

《AUTOSAR_SWS_SocketAdaptor》规范的主要内容包括&#xff1a; 简介和功能概述&#xff1a;说明了 AUTOSAR 基本软件模块 Socket Adaptor&#xff08;SoAd&#xff09;的功能、API 和配置。数据传输的 TCP/IP 概念在计算和电信环境中已成为标准&#xff0c;应用程序的寻址等…

代码随想录-栈和队列-用栈实现队列

问题描述 题目描述中有说不存在空栈的pop和peek&#xff0c;所以无需判断这个 解析 重点在于思路&#xff0c;代码白给。 要用栈实现队列&#xff0c;肯定是两个栈才可以。一个做入队操作&#xff0c;一个做出队操作。 首先入队简单&#xff0c;往栈里加就完事了。 出队复…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列&#xff0c;共包含以下文章&#xff1a; 结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式结构型模式&#xff08;二&#xff09;&#xff1a;代理模式结构型模式&#xff08;三&#xff09;&#xff1a;桥接模式、外观…

轻型民用无人驾驶航空器安全操控------理论考试多旋翼部分笔记

官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 说明&#xff1a;一是法规部分&#xff1b;二是多旋翼部分 本笔记全部来源于轻型民用无人驾驶航空器安全操控视频讲解平台 目录 官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 一、轻型民用无人…

【leetcode练习·二叉树】用「分解问题」思维解题 I

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 I | labuladong 的算法笔记] 105. 从前序与中序遍历序列构造二叉树 | 力扣 | LeetCode | 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵…

深入解析四种核心网络设备:集线器、桥接器、路由器和交换机

计算机网络系列课程《网络核心设备》 在现代网络技术中&#xff0c;集线器、桥接器、路由器和交换机扮演着至关重要的角色。本文&#xff0c;将深入探讨这四种设备的功能、工作原理及其在网络架构中的重要性。 集线器&#xff1a;基础网络连接设备 集线器&#xff08;Hub&…

宏景eHR uploadLogo.do 任意文件上传致RCE漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款专为复杂单组织或多组织客户设计的人力资源管理软件,融合了最新的互联网技术和先进的人力资源管理理念和实践。宏景eHR软件支持B/S架构,特别适合集团化管理和跨地域使用。它提供了全面的人力资源管理功能,包括人员、组织机构、…

ssm基于JAVA的网上订餐管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…