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

news2024/11/26 8:55:43

牛客网华为机试
上篇:算法|牛客网华为机试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; //该位置已走过标记为1
    temp_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-25
            vector<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_back
                array.push_back(num);
            else//中间insert
                array.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';//计算该部分数字总和 如果数字大于9
        else 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)//直到层数为0
                        break;
                }
                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){ //输入n
        int 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; //输入k
        if(k == 0) //k等于0直接输出0
            cout << 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.coloradmin.cn/o/2237600.html

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

相关文章

mysql5安全审计

安装插件 插件需要严格与数据库版本适配&#xff0c;不然安装过程中会出现问题 解压插件 cd 插件所在路径unzip audit-plugin-mysql-5.7-1.1.7-921-linux-x86_64.zip#查看mysql默认插件目录 mysql> SHOW GLOBAL VARIABLES LIKE plugin_dir;# 将插件移动到mysql默认插件目…

MySQL 安装与配置

MySQL 安装与配置 MySQL 安装 MySQL 一般分为社区版和商业版&#xff0c;我们使用的是社区版&#xff08;因为免费&#xff09;。MySQL 安装的教程在网上有很多&#xff0c;此处就不再进行进行赘述&#xff0c;这里推荐两篇文章&#xff1a;如何在 Windows11 中安装 MySQL 8.…

Flink安装和Flink CDC实现数据同步

一&#xff0c;Flink 和Flink CDC 1&#xff0c; Flink Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 中文文档 Apache Flink Documentation | Apache Flink 官方文档 &#xff1a;https://flink.apache.org Flink 中文社区…

车机版 Android Audio 框架笔记

车机版Android Audio 框架涉及的知识点很多&#xff0c;在工作中涉及的功能板块也及其繁杂&#xff0c;后面我会根据工作中的一些实际遇到的实例&#xff0c;逐步拆解 Android Audio的知识点&#xff0c;这里从网上整理了一些思维导图&#xff0c;可以做为未来的一个研究方向&a…

ubuntu 22.04 镜像源更换

双11抢了个云服务器&#xff0c;想要整点东西玩玩&#xff0c;没想到刚上来就不太顺利 使用sudo apt update更新软件&#xff0c;然后发生了如下报错 W: Failed to fetch http://mirrors.jdcloudcs.com/ubuntu/dists/jammy/InRelease 理所当然想到可能是镜像源连接不是很好&…

浅谈Agent

目录 什么是大模型 Agent &#xff1f; 大模型Agent 有哪些部分组成? 规划&#xff08;Planning&#xff09; Planning类型 不依赖反馈的计划 基于反馈的计划 拆解子目标和任务分解方法 COT TOT GOT LLMP 反思和完善 ReAct(融合推理与执行的能力) Reflexion(动态…

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下&#xff0c;某个局域网中&#xff0c;只有路由器的ip是公网的&#xff0c;局域网中的设备都是内网ip&#xff0c;内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用&#xff1f; 对于开启了NAT功能的局域网…

Jenkins插件使用问题总结

Git Push插件 插件介绍 主要是用于git推送代码到远程仓库中使用&#xff0c;插件地址 pipeline中使用 官方说明中只有一句代码gitPush(gitScm: scm, targetBranch: env.BRANCH_NAME, targetRepo: origin) 流水线语法中也做的不齐全所以一开始我老是设置错&#xff0c;导致代…

GPT-5 终于来了 —— 人们的预期与现实

高智慧人工智能的两面性&#xff0c;利用AI和被AI利用 前言&#xff1a;人工智能的热度持续升温&#xff0c;似乎已无处不在&#xff0c;但大家对它的感知却并不显著。这种状况有点像美国 2024 年的总统大选&#xff0c;投票前人们彼此不清楚支持谁&#xff0c;直到最终计票才发…

微服务透传日志traceId

问题 在微服务架构中&#xff0c;一次业务执行完可能需要跨多个服务&#xff0c;这个时候&#xff0c;我们想看到业务完整的日志信息&#xff0c;就要从各个服务中获取&#xff0c;即便是使用了ELK把日志收集到一起&#xff0c;但如果不做处理&#xff0c;也是无法完整把一次业…

Matlab实现鲸鱼优化算法优化随机森林算法模型 (WOA-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是受座头鲸捕食行为启发而提出的一种新型元启发式优化算法。该算法通过模拟座头鲸围绕猎物的螺旋游动和缩小包围圈的方式&#xff0c;在…

【学习笔记】网络设备(华为交换机)基础知识 10 —— 信息中心 ① 简介

提示&#xff1a;学习华为交换机信息中心的概述&#xff08; 包括信息中心的概念、功能、以及信息的分类、分级、和输出 &#xff09; &#xff1b;还包括信息中心常用的命令 &#xff08; 使能信息中心、命名信息通道、配置信息过滤、清除统计信息、查看信息中心相关信息的命令…

【unity】unity2021 URP管线下 SceneView没有MipMaps选项了怎么办?扩展Rendering Debugger工具

一、前言 之前项目 Unity打开后 Scene窗口 有一个MipMaps选项模式&#xff0c; 可以查看哪些贴图正常距离下发红 &#xff0c;说明用不到那么大&#xff0c;可以缩一下尺寸。 但 新的项目在Unity2021上&#xff0c;用了URP&#xff0c; 就没见过这个选项。 查了一篇介绍详细的…

前端代码分析题(选择题、分析题)——JS事件循环分析、await和作用域分析

Promise其实也不难-CSDN博客 Promise 的执行顺序分析 Promise 对象的执行是异步的&#xff0c;但其执行器函数内部的代码是立即执行的&#xff0c;而 then方法注册的回调函数则是在 Promise 状态改变后执行的。 const myPromise new Promise((resolve, reject) > {conso…

DAY24|回溯算法Part03|LeetCode:93.复原IP地址、78.子集、90.子集II

目录 LeetCode:93.复原IP地址 基本思路 C代码 LeetCode:78.子集 基本思路 C代码 LeetCode:90.子集II 基本思路 C代码 通过used实现去重 通过set实现去重 不使用used和set版本 LeetCode:93.复原IP地址 力扣代码链接 文字讲解&#xff1a;LeetCode:93.复原IP地…

ts 将100个元素,每行显示9个元素,然后显示出所有行的元素,由此我们延伸出一个项目需求的简单算法实现。

1、先看一下baidu ai出的结果&#xff1a; 2、我们将上面的代码修改下&#xff0c;定义一个数组&#xff0c;然后记录每行的行号及相应的元素&#xff1a; <template><div>console</div> </template> <script setup lang"ts"> import …

17、论文阅读:VMamba:视觉状态空间模型

前言 设计计算效率高的网络架构在计算机视觉领域仍然是一个持续的需求。在本文中&#xff0c;我们将一种状态空间语言模型 Mamba 移植到 VMamba 中&#xff0c;构建出一个具有线性时间复杂度的视觉主干网络。VMamba 的核心是一组视觉状态空间 (VSS) 块&#xff0c;搭配 2D 选择…

用 Python 从零开始创建神经网络(三):添加层级(Adding Layers)

添加层级&#xff08;Adding Layers&#xff09; 引言1. Training Data2. Dense Layer Class 引言 我们构建的神经网络变得越来越受人尊敬&#xff0c;但目前我们只有一层。当神经网络具有两层或更多隐藏层时&#xff0c;它们变成了“深度”网络。目前我们只有一层&#xff0c…

推荐一款功能强大的视频修复软件:Apeaksoft Video Fixer

Apeaksoft Video Fixer是一款功能强大的视频修复软件&#xff0c;专门用于修复损坏、不可播放、卡顿、画面失真、黑屏等视频问题。只需提供一个准确且有效的样本视频作为参考&#xff0c;该软件就能将受损视频修复到与样本视频相同的质量。该软件目前支持MP4、MOV、3GP等格式的…

Web前端开发--HTML语言

文章目录 前言1.介绍2.组成3.基本框架4.常见标签4.1双标签4.1.1.标题标签4.2.2段落标签4.1.3文本格式化标签4.1.4超链接标签4.1.5视频标签4.1.6 音频标签 4.2单标签4.2.1换行标签和水平线标签4.2.2 图像标签 5.表单控件结语 前言 生活中处处都有网站&#xff0c;无论你是学习爬…