算法学习——华为机考题库2(HJ11 - HJ20)

算法学习——华为机考题库2(HJ11 - HJ20)

HJ11 数字颠倒

描述

输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

数据范围: 0≤n≤2 30 −1
输入描述:
输入一个int整数

输出描述:
将这个整数以字符串的形式逆序输出

示例

在这里插入图片描述

代码解析

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

int main() {
    int num;
    cin>>num;
    string myStr = to_string(num);
    reverse(myStr.begin() , myStr.end());
    cout<<myStr;
}
// 64 位输出请用 printf("%lld")

HJ12 字符串反转

描述

接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:
输入一行,为一个只包含小写字母的字符串。

输出描述:
输出该字符串反转后的字符串。

示例

在这里插入图片描述

代码解析

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

int main() {
   string Str;
   cin>>Str;
   reverse(Str.begin(), Str.end());
   cout<<Str;
}
// 64 位输出请用 printf("%lld")

HJ13 句子逆序

描述

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”

所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

**数据范围:**输入的字符串长度满足 1≤n≤1000

注意本题有多组输入
输入描述:
输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。

输出描述:
得到逆序的句子

示例

在这里插入图片描述

代码解析

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

int main() {
    string myStr;
    getline(cin, myStr);
   
    reverse(myStr.begin(), myStr.end());
    // cout<<myStr<<endl;
    int left = 0 , right = 0;
    for(int right = 0 ; right < myStr.size() ; right++)
    {
        if(myStr[right] == ' ' )
        {
            reverse(myStr.begin() + left, myStr.begin() + right);
            left = right + 1;
        }
        if(right == myStr.size()-1)
        {
            reverse(myStr.begin() + left, myStr.begin() + right + 1);
        }
    }
    cout<<myStr;
}
// 64 位输出请用 printf("%lld")

HJ14 字符串排序

描述

给定 n 个字符串,请对 n 个字符串按照字典序排列。

数据范围: 1≤n≤1000 ,字符串长度满足 1≤len≤100
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。

示例

在这里插入图片描述

代码解析

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

static bool cmp(string &s1 , string &s2)
{   
   return s1 < s2;
}

int main() {
    int N;
    cin>>N;
    vector<string> myVec;
    string tmp;
    while(N--)
    {
        cin>>tmp;
        myVec.push_back(tmp);
    }

    sort(myVec.begin(), myVec.end(), cmp);
    
    for(int i = 0 ; i < myVec.size(); i++)
    {
        cout<< myVec[i]<<endl;
    }
       
}
// 64 位输出请用 printf("%lld")

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

描述

输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。

**数据范围:**保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)

输出描述:
这个数转换成2进制后,输出1的个数

示例

在这里插入图片描述

代码解析

#include <iostream>
using namespace std;

int main() {
    int num , result = 0;
    cin>>num;
    for(int i=0 ; i < 32 ; i++)
    {
        if((num&0x01 ) == 1 ) result++;
        num = num>>1;
    }
    cout<<result;
}
// 64 位输出请用 printf("%lld")

HJ16 购物单

描述

王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
在这里插入图片描述
在这里插入图片描述
输入描述:
输入的第 1 行,为两个正整数N,m,用一个空格隔开:

(其中 N ( N<32000 )表示总钱数, m (m <60 )为可购买的物品的个数。)

从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q

(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)

输出描述:
输出一个正整数,为张强可以获得的最大的满意度。

示例

在这里插入图片描述

代码解析

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int M,N;
    cin>>M>>N;
    M/=10;
    vector<vector<int>> price(N+1,vector<int>(3,0));
    vector<vector<int>> value(N+1,vector<int>(3,0));
    for(int i=1;i<=N;i++){
        int a,b,c;
        cin>>a>>b>>c;
        if(c==0){
            price[i][0]=a/10;
            value[i][0]=b;
        }
        else{
            if(price[c][1]!=0){
                price[c][2]=a/10;
                value[c][2]=b;
            }
            else{
                price[c][1]=a/10;
                value[c][1]=b;
            }
        }
    }
    vector<vector<int>> dp(N+1,vector<int>(M+1,0));
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            int a=price[i][0],b=value[i][0];
            int c=price[i][1],d=value[i][1];
            int e=price[i][2],f=value[i][2];
            dp[i][j]=j>=a?max(dp[i-1][j-a]+a*b,dp[i-1][j]):dp[i-1][j];
            dp[i][j]=j>=a+c?max(dp[i-1][j-a-c]+a*b+c*d,dp[i][j]):dp[i][j];
            dp[i][j]=j>=a+e?max(dp[i-1][j-a-e]+a*b+e*f,dp[i][j]):dp[i][j];
            dp[i][j]=j>=a+c+e?max(dp[i-1][j-a-e-c]+a*b+c*d+e*f,dp[i][j]):dp[i][j];
        }
    }
    cout<<dp[N][M]*10<<endl;
    return 0;
}

HJ17 坐标移动

描述

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

坐标之间以;分隔。

非法坐标点需要进行丢弃。如AA10; A1A; % ; YAD; 等。

下面是一个简单的例子 如:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

处理过程:

起点(0,0)

  • A10 = (-10,0)

  • S20 = (-10,-20)

  • W10 = (-10,-10)

  • D30 = (20,-10)

  • x = 无效

  • A1A = 无效

  • B10A11 = 无效

  • 一个空 不影响

  • A10 = (10,-10)

结果 (10, -10)

数据范围: 每组输入的字符串长度满足 1≤n≤10000 ,坐标保证满足 −2 31 ≤x,y≤2 31 −1 ,且数字部分仅含正数
输入描述:
一行字符串

输出描述:
最终坐标,以逗号分隔

示例

在这里插入图片描述

代码

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

int main() {
    string myStr;
    vector<string> date;
    cin>>myStr;
    int x =0 , y = 0;
    string tmp ;
    for(int i=0 ; i<myStr.size() ;i++)
    {
        if(myStr[i] == ';')
        {
            date.push_back(tmp);
            tmp.clear();
        }
        else tmp += myStr[i];
    }

    char dir;
    int lenght = 0;
    for(int i=0 ; i<date.size() ;i++)
    {
       dir = date[i][0];
       if(dir == 'A' ||dir == 'D' ||dir == 'W' ||dir == 'S')
       {
            tmp = date[i].substr(1,date[i].size() -1);

            bool flag = true;
            for(int x=0 ; x<tmp.size() ; x++ )  
            {
                if( tmp[x] >= '0' && tmp[x] <= '9')  {}
                else
                {
                    flag = false;
                    break;
                }

            }

            if(flag == true)
            {
                lenght = stoi(tmp);
                // cout<<dir<<lenght<<endl;
                if(dir == 'A') x -= lenght;
                else if(dir == 'D') x += lenght;
                else if(dir == 'W') y += lenght;
                else if(dir == 'S') y -= lenght;
            } 
            
       }
    }
    cout<<x<<','<<y;
}
// 64 位输出请用 printf("%lld")

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

描述

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址从1.0.0.0到126.255.255.255;

B类地址从128.0.0.0到191.255.255.255;

C类地址从192.0.0.0到223.255.255.255;

D类地址从224.0.0.0到239.255.255.255;

E类地址从240.0.0.0到255.255.255.255

私网IP范围是:

从10.0.0.0到10.255.255.255

从172.16.0.0到172.31.255.255

从192.168.0.0到192.168.255.255

子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
(注意二进制下全是1或者全是0均为非法子网掩码)

注意:

  1. 类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  2. 私有IP地址和A,B,C,D,E类地址是不冲突的

输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。

请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

示例

在这里插入图片描述

代码解析

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

bool judge_ip(string ip){
    int j = 0;
    istringstream iss(ip);
    string seg;
    while(getline(iss,seg,'.'))
        if(++j > 4 || seg.empty() || stoi(seg) > 255)
            return false;
    return j == 4;
}

bool is_private(string ip){
    istringstream iss(ip);
    string seg;
    vector<int> v;
    while(getline(iss,seg,'.')) v.push_back(stoi(seg));
    if(v[0] == 10) return true;
    if(v[0] == 172 && (v[1] >= 16 && v[1] <= 31)) return true;
    if(v[0] == 192 && v[1] == 168) return true;
    return false;
}

bool is_mask(string ip){
    istringstream iss(ip);
    string seg;
    unsigned b = 0;
    while(getline(iss,seg,'.')) b = (b << 8) + stoi(seg);
    if(!b) return false;
    b = ~b + 1;
    if(b == 1) return false;
    if((b & (b-1)) == 0) return true;
    return false;
}

int main(){
    string input;
    int a = 0,b = 0,c = 0,d = 0,e = 0,err = 0,p = 0;
    while(cin >> input){
        istringstream is(input);
        string add;
        vector<string> v;
        while(getline(is,add,'~')) v.push_back(add);
        if(!judge_ip(v[1]) || !is_mask(v[1])) err++;
        else{
            if(!judge_ip(v[0])) err++;
            else{
                int first = stoi(v[0].substr(0,v[0].find_first_of('.')));
                if(is_private(v[0])) p++;
                if(first > 0 && first <127) a++;
                else if(first > 127 && first <192) b++;
                else if(first > 191 && first <224) c++;
                else if(first > 223 && first <240) d++;
                else if(first > 239 && first <256) e++;
            }
        }
    }
    cout << a << " " << b << " " << c << " " << d << " " << e << " " << err << " " << p << endl;
    return 0;
}

HJ19 简单错误记录

描述

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

处理:

1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是“相同”的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

**数据范围:**错误记录数量满足 1≤n≤100 ,每条记录长度满足 1≤len≤100
输入描述:
每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

输出描述:
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

示例

在这里插入图片描述

代码解析

#include <algorithm>
#include <deque>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <vector>
using namespace std;


int main() {
    vector<pair<string , int>> date;
    string tmpName;
    int num;
    while (cin >> tmpName >> num) { 
        deque<char> tmDeq;
        for(int i=tmpName.size()-1 ; i > 0    ; i--)
        {
            if(tmpName[i] == '\\' ||tmpName.size() - i > 16 ) break;
            tmDeq.push_front(tmpName[i]);
        }
        tmpName.assign(tmDeq.begin(), tmDeq.end());

        tmpName += ' ';
        tmpName += to_string(num) ;
        // cout<<"tmpName "<<tmpName<<endl;
        bool flag = false;
        for(int i=0 ; i <date.size() ; i++)
        {
            if(date[i].first == tmpName)
            {
                date[i].second++;
                flag = true;
            } 
        }
        if(flag == false) date.push_back({tmpName , 1});
    }

    if(date.size() > 8)
    { 
        for(int i=date.size()-8 ; i<date.size() ; i++)
            cout<<date[i].first << ' '<<date[i].second<<endl;
    }else 
    {
        for(int i=0 ; i<date.size() ; i++)
            cout<<date[i].first << ' '<<date[i].second<<endl;
    }

   

    date.clear();
}
// 64 位输出请用 printf("%lld")

HJ20 密码验证合格程序

描述

密码要求:

1.长度超过8位

2.包括大小写字母.数字.其它符号,以上四种至少三种

3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)

数据范围:输入的字符串长度满足 1≤n≤100
输入描述:
一组字符串。

输出描述:
如果符合要求输出:OK,否则输出NG

示例

在这里插入图片描述

代码解析

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

string cheak(string &tmp)
{
    int flag[4] = {0,0,0,0};
    if(tmp.size() <= 8) return "NG";
    for(int i=0 ; i <tmp.size() ; i++)
    {
        if(tmp[i] >= 'A' && tmp[i] <= 'Z') flag[0] = 1;
        else if(tmp[i] >= 'a' && tmp[i] <= 'z') flag[1] = 1;
        else if(tmp[i] >= '0' && tmp[i] <= '9') flag[2] = 1;
        else flag[3] = 1;
    }
    int count = 0;
    for(int i=0 ; i<4 ; i++)
        if(flag[i] == 1) count++;
    if(count < 3) return "NG";
    
    for(int i=0 ; i<tmp.size() ; i++)
    {
        for(int j=i+3 ; j<tmp.size() ; j++)
        {
            if(tmp[i] == tmp[j] && tmp[i+1] == tmp[j+1] && tmp[i+2] == tmp[j+2])
                return "NG";
        }
    }

    return "OK";
}

int main() {
    string tmp;
    while (cin >> tmp )
    {
        cout << cheak(tmp) << endl;
    }
}
// 64 位输出请用 printf("%lld")

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

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

相关文章

个人网站如何让搜索引擎收录

当我们花费功夫搭建好个人网站&#xff0c;如何能让搜索引擎搜索到个人网站呢&#xff1f;比如百度&#xff0c;根本百度不到自己网站的内容。这时候就要使用到搜索引擎提供的站点收录功能了&#xff0c;但是点开百度的搜索资源平台&#xff0c;添加自己的站点时&#xff0c;就…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

地理坐标系、空间坐标系、epsg查询网站

坐标系可用范围和详细信息的查询网站 简介 epsg.ruiduobao.com是一个可以查询gdal中所有坐标系信息的网站&#xff0c;可查询到坐标系的基准面、椭球体、中央子午线等相关信息&#xff0c;并对每个坐标系的可用范围在地图中进行了显示。详细信息可以看操作视频&#xff1a; e…

使用D3.js和React绘制动画条形图

摘要: 将条形图分解为独立组件:容器、坐标轴和条形。使用SVG和D3.js绘制这些组件。使用React的callback ref在DOM中渲染它们。 使用D3绘制图表像搭建乐高 使用D3.js绘制图表时,你处理各种独立组件 —— 很像乐高积木。你单独建造组件,然后将它们组装在一起创建最终图表。这适…

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用&#xff1a; 实现按钮的文本切换 QStateMachine machine; //定义状态机&#xff08;头文件定义&#xff09;QState *off new QState(); //添加off 状态off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该…

MacBook安装软件时允许任何来源的软件

MacBook安装软件时允许任何来源的软件 临时设置允许未知来源的app 当下载网上的软件并安装时,会安装失败, 因为MacOS默认只允许安装App Store上的软件 这时可以临时允许安装,如下设置 开启设置—->安全性与隐私—->未知来源的app 这种方式比较安全 设置允许任何来源…

基于WordPress开发微信小程序2:决定开发一个wordpress主题

上一篇&#xff1a;基于WordPress开发微信小程序1&#xff1a;搭建Wordpress-CSDN博客 很快发现一个问题&#xff0c;如果使用别人的主题模板&#xff0c;多多少少存在麻烦&#xff0c;所以一咬牙&#xff0c;决定自己开发一个主题模板&#xff0c;并且开源在gitee上&#xff…

freertos 源码分析二 list链表源码

list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…

LabVIEW核能设施监测

LabVIEW核能设施监测 在核能领域&#xff0c;确保设施运行的安全性和效率至关重要。LabVIEW通过与硬件的紧密集成&#xff0c;为高温气冷堆燃料装卸计数系统以及脉冲堆辐射剂量监测与数据管理系统提供了解决方案。这些系统不仅提高了监测和管理的精确度&#xff0c;也保证了核…

pytorch创建tensor

目录 1. 从numpy创建2. 从list创建3. 创建未初始化tensor4. 设置默认tensor创建类型5. rand/rand_like, randint6. randn生成正态分布随机数7. full8. arange/range9. linspace/logspace10. Ones/zeros/eye11. randperm 1. 从numpy创建 2. 从list创建 3. 创建未初始化tensor T…

Fashion MNIST数据集介绍及基于Pytorch下载数据集

Fashion MNIST数据集介绍及基于Pytorch下载数据集 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;Fashion MNIST数据集简介&#x1f333;Fashion MNIST数据集的类别说明Fashion MNIST数据集图片示例 &#x1f333;基于PyTorch下载Fashion MN…

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是&#xff0c;紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中&#xff0c;很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心&#xff0c;每个簇一个&#xff0c;并将…

ElasticSearch-ElasticSearch实战-仿京东商城搜索(高亮)

注&#xff1a;此为笔者学习狂神说ElasticSearch的实战笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 七、ElasticSearch实战 仿京东商城搜索&#xff08;高亮&#xff09; 1、工程创建…

【tensorflow 版本 keras版本】

#. 安装tensorflow and keras&#xff0c; 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表&#xff0c;确定安装的tesorflow, keras

JAVA后端上传图片至企微临时素材

1.使用场景 在使用企业微信API接口中&#xff0c;往往开发者需要使用自定义的资源&#xff0c;比如发送本地图片消息&#xff0c;设置通讯录自定义头像等。 为了实现同一资源文件&#xff0c;一次上传可以多次使用&#xff0c;这里提供了素材管理接口&#xff1a;以media_id来…

尝试创建若依系统项目(vue3+element-plus+vite) 持续更新...

若依官网&#xff1a;RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架|Java|Spri…

STM32--USART串口(3)数据包

一、前言 在实际的工程中肯会有同时发送多种数据的情况&#xff0c;比如要不停的发送x、y、z分别对应三种不同的数据。xyzxyzxyz&#xff0c;但接收方可能是从中间某个地方开始接收的&#xff0c;这就导致数据错位。所以我们就需要将数据进行分割&#xff0c;打包成一个一个的…

数仓建模维度建模理论知识

0. 思维导图 第 1 章 数据仓库概述 1.1 数据仓库概述 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的…

Kotlin快速入门系列10

Kotlin的委托 委托模式是常见的设计模式之一。在委托模式中&#xff0c;有两个对象参与处理同一个请求&#xff0c;接受请求的对象将请求委托给另一个对象来处理。与Java一样&#xff0c;Kotlin也支持委托模式&#xff0c;通过关键字by。 类委托 类的委托即一个类中定义的方…

东南亚独立站的黄金机会-东南亚服务器租用托管的选择

作为一个独立站的企业&#xff0c;选择将服务器托管或租用东南亚的服务器是一个明智的决策。东南亚市场是一个适合做独立站的国家。 1、东南亚的社交媒体用户非常活跃。东南亚地区的人口众多&#xff0c;其中很大一部分人使用社交媒体平台进行社交和购物。据统计&#xff0c;东…