算法|牛客网华为机试53-62C++

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

文章目录

  • HJ53 杨辉三角的变形
  • HJ54 表达式求值
  • HJ55 挑7
  • HJ56 完全数计算
  • HJ57 高精度整数加法
  • HJ58 输入n个整数,输出其中最小的k个
  • HJ59 找出字符串中第一个只出现一次的字符
  • HJ60 查找组成一个偶数最接近的两个素数
  • HJ61 放苹果
  • HJ62 查找输入整数二进制中1的个数

HJ53 杨辉三角的变形

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

解题思路:
写几行就可以发现规律:
n1或2时,没有偶数,cout<<-1;
n
3时,index=2;
n4,index=3;
n
5,index=2;
n6,index=4;
n
7,index=2;
n8,index=3;
n
9,index=2;
n10,index=4;

可以发现,index=2,3,2,4重复出现,将n对4取余,可以发现如下规律:
n%4
3||n%41,index2;
n%40,index=3;
n%4
2,index=4;

解法:

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==1||n==2)
        {
            cout<<-1<<endl;
        }
        else if(n%4==3||n%4==1)
        {
            cout<<2<<endl;
        }
        else if(n%4==0)
        {
            cout<<3<<endl;
        }
        else
        {
            cout<<4<<endl;
        }
    }
    return 0;
}

HJ54 表达式求值

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

解题思路:
题解 | #表达式求值#
解法:

#include <iostream>
#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';//计算该部分数字总和
        if(s[i] == '('){ //进入左括号
            int layer = 0; //统计左括号层数
            int j = i;
            while (j <= right) {//遍历到右边
                if(s[j]=='(')
                    layer++;//遇到左括号,层数累加
                else if (s[j] == ')') {
                    layer--;//遇到右括号层数递减
                    if (layer == 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 s;
    while (cin >> s) { // 注意 while 处理多个 case
        cout << compute(s, 0, s.length() - 1) << endl;
    }
    return 0;
}

HJ55 挑7

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

解题思路:
写一个判断函数
核心就是取余、除以
解法:

#include <iostream>
using namespace std;

bool isSev(int num){
    while (num>0) {
        if(num % 10 == 7){
            return true;
        }
        num /= 10;
    }
    return false;
}

int main() {
    int n;
    while (cin >> n) { // 注意 while 处理多个 case
        int ans = 0;
        for(int i = 1;i <= n; ++i){
            if(i % 7 == 0){
                ans++;
                continue;
            }
            if(isSev(i)){
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

HJ56 完全数计算

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

解题思路:
#include <numeric> 是C++中的一个预处理指令,用于包含标准库中的 <numeric> 头文件。这个头文件提供了一些用于数值计算的函数模板,比如累加、累乘、部分求和等。

accumulate<numeric> 头文件中定义的一个函数模板,它用于计算一个范围内所有元素的累加和。具体来说,accumulate 函数接受三个参数:

  1. 第一个参数InputIt first,表示输入范围的起始迭代器。
  2. 第二个参数InputIt last,表示输入范围的结束迭代器(不包括这个迭代器指向的元素)。
  3. 第三个参数T init,表示累加的初始值。

函数模板的基本形式如下:

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

这里,InputIt 是一个迭代器类型,它可以指向任何支持递增和解引用操作的容器或数组的元素。T 是累加结果的类型,也是初始值的类型。

accumulate 函数的工作原理是从 first 开始,逐个将 last 之前的每个元素加到 init 上,直到遍历完所有的元素。

下面是一个使用 accumulate 函数的简单例子:

#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5};
    int sum = std::accumulate(data.begin(), data.end(), 0);
    std::cout << "Sum: " << sum << std::endl; // 输出 15
    return 0;
}

在这个例子中,accumulate 函数计算了 vector 中所有整数的和,并将结果存储在变量 sum 中。

accumulate 还可以接受一个可选的第四个参数,这是一个二元操作函数或函数对象,用于指定如何合并元素,而不仅仅是加法。例如:

#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5};
    int product = std::accumulate(data.begin(), data.end(), 1, std::multiplies<int>());
    std::cout << "Product: " << product << std::endl; // 输出 120
    return 0;
}

在这个例子中,accumulate 函数计算了 vector 中所有整数的乘积,使用了 std::multiplies<int>() 作为二元操作函数。
另一种解法:HJ56_iNOC产品部–完全数计算(C++)

解法:

#include <iostream>
 
#include <algorithm>
#include <vector>
#include <cmath>
#include <numeric>
 
using namespace std;
bool judge(int x){
    vector<int> ivec;
    int result=0;
    for(int i =1;i<x;i++){
        if(x%i==0) ivec.push_back(i);
    }
    result=accumulate(ivec.begin(),ivec.end(),0);
    if(result==x) return true;
    return false;
}
 
int main() {
    int N;
    while(cin>>N){
        int cnt = 0;
        bool perfect = false;
        for(int i =1;i<=N;i++){
            perfect = judge(i);
            if(perfect) cnt++;
        }
        cout<<cnt<<endl;
    }
}

HJ57 高精度整数加法

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

解题思路:
高精度整数用长整型也会越界,需要用STL容器处理,用stack 栈后进先出(LIFO)或者vector都可以。
解法:

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

// 将两个字符串存入两个栈中,后进先出(LIFO),逐个斩当头,直到栈为空
// 主要注意进位问题,最后一位的问题
int main() {
    string s1,s2;
    while (cin >> s1 >> s2) { // 注意 while 处理多个 case
       string ans;
       stack<char> str1,str2;
       for(auto c:s1){
        str1.push(c);
       }
       for(auto c:s2){
        str2.push(c);
       }
       int flag = 0;
       while (str1.size() != 0 || str2.size() != 0) {
            int temp = 0;
            if(str1.size() != 0){
                temp += str1.top() - '0';
                str1.pop();
            }
            if(str2.size() != 0){
                temp += str2.top() - '0';
                str2.pop();
            }
            // temp和flag加完后再取余和除以,这是考虑到加完flag后刚好为10的情况
            ans+=(temp+flag)%10+'0';
            flag = (temp+flag)/10;
            //对于两个栈都空之前,判断有没有进位,如果进位则直接加1
            if(flag == 1 && str1.size() == 0 && str2.size() == 0)
                ans+='1';
       }
       // 记得反转一下再输出
       reverse(ans.begin(),ans.end());
       cout<<ans<<endl;
    }
    return 0;
}

HJ58 输入n个整数,输出其中最小的k个

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

解题思路:
使用sort直接获得答案。
解法:

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

int main() {
    int a, b;
    while (cin >> a >> b) { // 注意 while 处理多个 case
        vector<int> vec(a,0);
        for (int i=0; i<a; ++i) {
            cin>>vec[i];
        }
        sort(vec.begin(), vec.end());
        for (int i=0;i<b;++i) {
           cout<<vec[i]<<" ";
        }
    }
    return 0;
}

HJ59 找出字符串中第一个只出现一次的字符

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

解题思路:
使用vector数组顺序存储,输出第一个元素。
解法:

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

int main() {
    string str;
    cin >> str;
    vector<char> vec;
    vector<char> vecs;
    for (char c : str) {
        // 检查 vecs 中是否已经存在字符 c
        if (std::find(vecs.begin(), vecs.end(), c) != vecs.end()) {
            continue;
        }
        // 检查 vec 中是否已经存在字符 c
        if (std::find(vec.begin(), vec.end(), c) != vec.end()) {
            // 如果存在,添加到 vecs 并从 vec 中移除所有相同的字符
            vecs.push_back(c);
            auto newEnd = std::remove(vec.begin(), vec.end(), c);
            vec.erase(newEnd, vec.end());
        } else {
            // 如果不存在,添加到 vec
            vec.push_back(c);
        }
    }
    if(vec.size()>0){
        cout<<vec.at(0);
    }
    else {
        cout<<-1;
    }
    return 0;
}

HJ60 查找组成一个偶数最接近的两个素数

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

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

#include <cmath>
#include <iostream>
using namespace std;
// 判断一个数是否为素数
bool isPrime(int n){
    for(int i=2;i<n;++i){
        if(n%i == 0){
            return false;
        }
    }
    return true;
}

int main() {
    int a;
    while (cin >> a) { // 注意 while 处理多个 case
        int mindis = a;
        pair<int,int> res;// 记录两个素数
        for(int i = 2;i<a;i++){
            if(isPrime(i) && isPrime(a - i)){
                if(abs(a - i - i)<mindis){
                    res = {i,a-i};
                    mindis = abs(a - i - i);
                }
            }
        }
        cout<<res.first<<endl<<res.second<<endl;
    }
    return 0;
}

HJ61 放苹果

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

解题思路:
动态规划,分两种情况,有空盘子和没有空盘子,递归到最后只有两种情况,0个盘子放n个苹果或者n个苹果放1个盘子。
解法:

#include <stdio.h>
#include <string.h>
 
int f(int m, int n);
 int main()
{
    int m, n;
     while (scanf("%d %d", &m, &n) != EOF)
    {
        printf("%d\n", f(m, n));
    }
 
    return 0;
}
 
int f(int m, int n)
{
    int ret;
    if (n == 1)
    {
        ret = 1; //m个果放1个盘子 1种
    }
    else if (m == 0)
    {
        ret = 1; //0个果放n个盘子 1种
    }
    else if (m < n)
    {
        ret = f(m,m); 
        //当m<n:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响,
        //即if(n>m) f(m,n) = f(m,m) 问题变成m个苹果,m个盘子的问题。即下面的m>=n的情况.
    }
    else if (m >= n)
    {
        ret = f(m - n, n) + f(m, n - 1); 
        //1.至少有一个空盘f(m,n) = f(m,n-1);
        //2.一个空盘都没有f(m,n) = f(m-n,n);(即如果所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目.
        //分析则有,总的放苹果的放法数目等于1、2两者的和,即 f(m,n) =f(m,n-1)+f(m-n,n))
    }
 
    return ret;
}

HJ62 查找输入整数二进制中1的个数

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

解题思路:
解法一使用STL库。
解法二运用位运算进行操作。
解法一:

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

int main() {
    int n;
    while(cin>>n){
        bitset<32> b(n);
        cout<<b.count()<<endl;
    }
}
// 64 位输出请用 printf("%lld")

解法二:

#include <iostream>
using namespace std;

int n, res; // 定义我们输入的 n 和我们最后的二进制1的个数
void solve() {
    while(cin >> n) { // 多组输入我们的 n
        res = 0; // 因为是多组输入,我们把我们每次的答案都先清空为 0
        while(n) { // 如果 n 还有数字,不为0
            if (n & 1) res++; // 如果当前 n 的最后一位二进制位是 1, 答案加1
            n >>= 1; // n 向右移一次,将刚才计算过的二进制位剔除掉
        }
        cout << res << "\n"; // 输出最后的一个答案
    }
}
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    solve();
    return 0;
}

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

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

相关文章

消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)

1、TCP和UDP概述 TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;和UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;都算是最底层的通信协议&#xff0c;它们位于OSI模型的传输层。*传输层的主要职责是确保…

springboot基于Spring Boot的智慧养老服务系统的设计与实现

系统介绍&#xff1a; 智慧养老服务系统是一种运用现代科技手段&#xff0c;整合各类养老资源&#xff0c;为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术&#xff0c;实现对老年人健康状况、生活需求的实时监控与精准匹配&…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法&#xff0c;步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一&#xff0e;软硬…

python实现http文件服务器访问下载

//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler&#xff0c;将根目录设置为脚本所在目录 class MyHTT…

【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)

文章目录 前言一、InputAction简介1、InputAction是什么&#xff1f;2、示例 二、监听事件started 、performed 、canceled1、启用输入检测2、操作监听相关3、关键参数 CallbackContext4、结果 三、InputAction参数相关1、点击齿轮1.1 Actions 动作&#xff08;1&#xff09;动…

Python 在Word中添加、或删除超链接

在Word文档中&#xff0c;超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接&#xff0c;用户可以轻松地导航到相关信息&#xff0c;从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…

css粘性定位超出指定宽度失效问题

展示效果 解决办法&#xff1a;外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…

携程旅行 登录分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 所有加密流程基本一样就说…

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计

源码 论文 下载地址&#xff1a; ​​​​c​​​​​​c基于JAVA的网络通讯系统设计与实现(源码系统论文&#xff09;https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…

PageView组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了如何屏蔽事件关的内容,本章回中将介绍PageView Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的PageView是指左右滑动或者上下滑动显示不同的页面&#xff0c;Flutter把它…

《Memory Barriers a Hardware View for Software Hackers》阅读笔记

CPU 设计者引入内存屏障&#xff08;memory barriers&#xff09;是为了应对在多处理器系统&#xff08;SMP&#xff09;中&#xff0c;内存引用重排序可能导致的同步问题。尽管重排序可以提高性能&#xff0c;但在某些情况下&#xff08;如同步原语&#xff09;&#xff0c;正…

网络编程-网络原理HTTP1

文章目录 HTTP请求/响应的基本结构认识URLURL是什么和基本格式关于encoding机制 认识方法(method)GET方法简介GET方法的特点POST方法简介POST方法的特点GET和POST的区别(经典面试题)关于GET和POST的补充说明Restful风格 上节主要是对http协议的一些最基本的概念做出一些说明, 然…

Facebook广告点击率CTR太低 如何优化

在投放Facebook广告的过程中&#xff0c;点击率CTR是一个衡量广告效果的重要指标&#xff0c;和广告质量、受众定位准确性、转化率等息息相关&#xff0c;因此&#xff0c;提升CTR是一个重要的广告优化流程。 一、什么是Facebook广告点击率&#xff0c;如何查看&#xff1f; C…

编写、应用中断例程

实验内容、程序清单及运行结果 编写、应用中断例程&#xff08;课本实验13&#xff09; 编写并安装int 7ch中断例程&#xff0c;功能为显示一个用0结束的字符串&#xff0c;中断例程安装在0:200处。 assume cs:code data segment db welcome to masm!,0 data ends code s…

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析&#xff1a;布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”

起因 环境&#xff1a;Windows10 背景&#xff1a;之前就是按照官方说明创建个rsa密钥&#xff0c;在git后台添加上&#xff0c;就行了&#xff0c;近期怎么添加怎么失败&#xff0c;总是“Error: Permission denied (publickey)”的提示&#xff01; 尝试 各种尝试&#xf…

ESP32S3基于espidf lvgl驱动i2c ssd1306/sh1106/7屏幕使用

ESP32S3基于espidf lvgl驱动i2c ssd1306/sh1106/7屏幕使用 &#x1f516;个人使用的espidf版本&#xff1a;V5.4&#xff0c;lvgl组件版本&#xff1a;8.3.0&#xff08;可在idf_component.yml文件中看到&#xff09; 对于 i2c ssd1306接口屏幕&#xff0c;可以直接使用自带的d…