[TOC]

​ 华为机试题库共103道题目,其中入门级5道,简单级46道,中等级36道,较难级13道,困难级3道。计划在7天内共完成入门级,简单级,中等级的共计87道题目,则每天应当完成13道左右。计划每天完成:

​ 入门级:1道 简单级:7道 中等级:6道

一、入门级

HJ7 取近似值

#include<bits/stdc++.h>
using namespace std;

int main(){
    float n;
    cin>>n;
    int b=n;
    float c=n-b;
    if(c>=0.5){
        b+=1;
    }
    cout<<b;
    return 0;
}

二、简单级

1、HJ21 简单密码

#include<bits/stdc++.h>
using namespace std;

int main(){
    // 获取输入
    string s;
    getline(cin,s);
    // 处理字符串
    vector<pair<string,int>> arr;
    for(int i=0;i<s.length();++i){
        if(s[i]>='A'&&s[i]<='Z'){
            if(s[i]=='Z') s[i]='a';
            else {
                s[i]=tolower(s[i]+1);
            }
        }
        else if(s[i]>='a'&&s[i]<='c'){
            s[i]='2';
        }
        else if(s[i]>='d'&&s[i]<='f'){
            s[i]='3';
        }
        else if(s[i]>='g'&&s[i]<='i'){
            s[i]='4';
        }
        else if(s[i]>='j'&&s[i]<='l'){
            s[i]='5';
        }
        else if(s[i]>='m'&&s[i]<='o'){
            s[i]='6';
        }
        else if(s[i]>='p'&&s[i]<='s'){
            s[i]='7';
        }
        else if(s[i]>='t'&&s[i]<='v'){
            s[i]='8';
        }
        else if(s[i]>='w'&&s[i]<='z'){
            s[i]='9';
        }
    }
    cout<<s<<endl;
    return 0;
}

2、HJ73 计算日期到天数转换

#include<bits/stdc++.h>
using namespace std;

int getDays(int y,int m){
    int days=0;
    // 二月份的天数
    if(m==2)
        // 如果是闰年,该年份能被 4 整除同时不能被 100 整除;或者该年份能被400整除。
        if((y%4==0&&y%100!=0)||y%400==0) days=29;
        // 如果不是闰年
        else days=28;
    // 天数为31的月份
    else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
        days=31;
    // 天数为30的月份
    else if(m==4||m==6||m==9||m==11)
        days=30;
    return days;
}

int main(){
    // 获取输入
    int y,m,d;
    cin>>y>>m>>d;
    // 处理字符串
    int res=0;
    for(int i=1;i<m;++i){
        res+=getDays(y,i);
    }
    res+=d;
    // 输出结果
    cout<<res<<endl;
    return 0;
}

3、HJ96 表示数字

#include<bits/stdc++.h>
using namespace std;

int main(){
    // 获取输入
    string s;
    cin>>s;
    // 处理字符串
    for(int i = 0; i < s.length(); i++){
        if(isdigit(s[i])){ // 每次第一个遇到的数字前加*
            s.insert(i, "*");
            i++;
            while(isdigit(s[i])) //遍历连续的数字找到这一段的最后一个数字
                i++;
            s.insert(i, "*"); //最后加*
        }
    }
    // 输出结果
    cout << s << endl;
    return 0;
}

4、HJ87 密码强度等级

#include<bits/stdc++.h>
using namespace std;
int main(){
    // 获取输入
    string s;
    getline(cin,s);
    // 计算分数
    int score=0;
    // 检查长度
    int len=s.length();
    if(len<=4) score+=5;
    else if(len<=7) score+=10;
    else if(len>=8) score+=25;
    // 统计字母、数字、符号的个数
    int alpha_A=0;
    int alpha_a=0;
    int digit=0;
    int other=0;
    for(char c:s){
        if(isdigit(c))digit++;
        else if(c>='a'&&c<='z')alpha_a++;
        else if(c>='A'&&c<='Z')alpha_A++;
        else other++;
    }
    //cout<<alpha_A<<alpha_a<<digit<<other;
    //检查字母
    if(alpha_A==0&&alpha_a==0) score+=0;
    else if(alpha_A==0||alpha_a==0) score+=10;
    else if(alpha_A>0||alpha_a>0)score+=20;
    //cout<<score;
    // 检查数字
    if(digit==0) score+=0;
    else if(digit==1) score+=10;
    else if(digit>1)score+=20;
    //cout<<score;
    // 检查符号
    if(other==0) score+=0;
    else if(other==1) score+=10;
    else if(other>1)score+=25;
    //cout<<score;
    // 检查奖励
    int n=0;
    if((alpha_a>0||alpha_A>0)&&digit>0) n=3;
    if((alpha_a>0||alpha_A>0)&&digit>0&&other>0) n=3;
    if(alpha_a>0&&alpha_A>0&&digit>0&&other>0)n=5;
    score+=n;
    //cout<<score;
    // 输出结果
    if(score>=90) cout<<"VERY_SECURE"<<endl;
    else if(score>=80) cout<<"SECURE"<<endl;
    else if(score>=70) cout<<"VERY_STRONG"<<endl;
    else if(score>=60) cout<<"STRONG"<<endl;
    else if(score>=50) cout<<"AVERAGE"<<endl;
    else if(score>=25) cout<<"WEAK"<<endl;
    else if(score>=0) cout<<"VERY_WEAK"<<endl;
    return 0;
}

5、HJ22 汽水瓶

#include<bits/stdc++.h>
using namespace std;
/*
方法一:观察规律
注意到每两个空汽水瓶就可以通过借一个空汽水瓶来喝到一瓶汽水,
故最多可以喝到的汽水瓶数等于空汽水瓶数除以二,即 sum = num / 2
方法二:
n>=2时才有可能喝到汽水,只要手上的空汽水瓶数大于或等于2,不论情况如何,先借一个空汽水瓶
*/
int main(){
    int num;
    while(cin>>num){
        if(num==0) break;// 0表示输入结束,不用处理
        int sum = 0; //计数器,最多可以喝的汽水瓶数
        // 空汽水瓶数大于或等于 2 时,至少可以喝到一瓶汽水,如通过“先借后还”方式就可以喝到汽水
        while (num >= 2)
        {
            num += 1; //只要手上的空汽水瓶数大于或等于2,不论情况如何,先借一个空汽水瓶
            int count = num / 3; //一次空汽水瓶换汽水操作后可以喝到的汽水瓶数(3 个空汽水瓶换 1 瓶汽水,喝它!)
            num = num % 3 + count - 1; //剩下的空汽水瓶数,包括之前没换的空汽水瓶 + 喝完汽水后的空汽水瓶 + 要还回去空汽水瓶(之前借了一个空汽水瓶);
            sum += count; //累计可以喝到的汽水瓶数
        }
        cout<<sum<<endl;
    }
    return 0;
}

6、HJ80 整型数组合并

#include<bits/stdc++.h>
using namespace std;

int main(){
    // 获取输入
    int n1,n2,tmp;
    vector<int> s1;
    vector<int> s2;
    cin>>n1;
    while(n1--){
        cin>>tmp;
        s1.push_back(tmp);
    }
    cin>>n2;
    while(n2--){
        cin>>tmp;
        s2.push_back(tmp);
    }
    // 将2个数组排序下
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    // 同时合并两个有序数组
    string res;
    int i=0;
    int j=0;
    unordered_set<int> set;//哈希集合,用来去重
    while(i<s1.size()&&j<s2.size()){
        // 谁小添加谁
        if(s1[i]<=s2[j]) {
            // 如果之前集合中没有才添加,保证不会有重复的
            if(!set.count(s1[i])){
                set.insert(s1[i]);
                res+=to_string(s1[i]);
            }
            i++;
        }
        else if(s1[i]>s2[j]){
            // 如果之前集合中没有才添加,保证不会有重复的
            if(!set.count(s2[j])){
                set.insert(s2[j]);
                res+=to_string(s2[j]);
            }
            j++;
        }
        
    }
    while(i<s1.size()){
        // 如果之前集合中没有才添加,保证不会有重复的
        if(!set.count(s1[i])){
                set.insert(s1[i]);
            res+=to_string(s1[i]);
        }
        i++;
    }
    while(j<s2.size()){
        // 如果之前集合中没有才添加,保证不会有重复的
        if(!set.count(s2[j])){
            set.insert(s2[j]);
            res+=to_string(s2[j]);
        }
        j++;
    }
    cout<<res<<endl;
    return 0;
}

7、HJ35 蛇形矩阵

#include <bits/stdc++.h>
using namespace std;

int main(){
    // 获取输入
    int n;
    cin>>n;
    // 间隔变,计算各个数字
    int beg=1;// 每行的开始数字
    for(int i=1;i<=n;i++)
    {
        cout<<beg;
        int tmp = beg;// 每行中的数
        for(int j=i+1;j<=n;j++)
        {
            tmp+=j;
            cout<<" "<<tmp;              
        }
        cout<<endl;
        beg+=i;
    }
}

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

#include <bits/stdc++.h>
using namespace std;
int main(){
    // 获取输入
    int n;
    cin>>n;
    int res=0;
    while(n){
        if(n%2==1) res++;
        n=n/2;
    }
    cout<<res;
}

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

#include<bits/stdc++.h>
using namespace std;

int main(){
    // 获取输入
    int n;
    while(cin>>n){
        int res=0;
        while(n){
            if(n%2==1) res++;
            n=n/2;
        }
        cout<<res<<endl;
    }
    return 0;
}

10、HJ86 求最大连续bit数

#include <bits/stdc++.h>
using namespace std;

int main(){
    // 获取输入
    int n;
    cin>>n;
    //转换为二进制
    string s;// 该数字的二进制格式
    while(n){
        s=to_string(n%2)+s;
        n=n/2;
    }
    // 记录该二进制下的连续1的个数
    int res=0;
    for(int i=0;i<s.length();++i){
        // 从i出发,计算连续1的个数tmp
        int tmp =0;    //计数器,存放临时变量
        while(i<s.length()&&s[i]=='1'){
            tmp++;
            i++;
        }
        // 保存历史最大值
        res=max(res,tmp);
    }
    cout<<res;
}

11、HJ97 记负均正

#include<bits/stdc++.h>
using namespace std;
int main(){
    // 获取输入
    int n,tmp;
    cin>>n;
    int num_1=0;// 正数个数
    int num_2=0;// 负数个数
    double sum=0.0;
    while(n--){
        cin>>tmp;
        if(tmp>0) {
            sum+=tmp;
            num_1++;
        }
        else if(tmp<0)num_2++;
    }
    double mean=0.0;
    if(num_1!=0) mean=sum/num_1;
    printf("%d %.1f\n",num_2,mean);
    return 0;
}

12、HJ83 二维数组操作

#include<bits/stdc++.h>
using namespace std;
/*这道题不需要实现表格功能,只要满足对应的输入输出即可*/
int main(){
    int m,n;    //数据表的行数和列数
    while(cin>>m>>n) {    //输入数据表的行数和列数
        // 初始化表格
        if(m>9 || n>9)    //如果行数或者列数大于9,返回-1,否则返回0
            cout<<-1<<endl;
        else
            cout<<0<<endl;
        // 交换2个坐标
        int x1,y1,x2,y2;    //(x1,y1)(x2,y2)为两个坐标
        cin>>x1>>y1>>x2>>y2;    //分别输入x1,y1,x2,y2的值
        if(x1>=m || y1>=n || x2>=m || y2>=n)    //如果行坐标的值大于等于数据表的行数;或者列坐标的值大于等于数据表的列数,那么返回-1,否则返回0
            cout<<-1<<endl;
        else
            cout<<0<<endl;
        // 在row上添加一行
        int row;    //row为行号
        cin>>row;    //输入行号
        if(row<0 && row>=m || m==9)    //如果行号大于数据表的行数,或者数据表的行数为9,则返回-1,否则返回0
            cout<<-1<<endl;
        else
            cout<<0<<endl;
        // 在column左边添加一列
        int column;    //row为列号
        cin>>column;    //输入列号
        if(column<0 || column>=n || n==9)    //如果列号大于数据表的列数,或者数据表的列数为9,则返回-1,否则返回0
            cout<<-1<<endl;
        else
            cout<<0<<endl;
        // 查询x和y的坐标值
        int x,y;    //(x,y)为坐标
        cin>>x>>y;    //输入x和y的值
        if(x<0 || x>=m || y<0 || y>=n)    //如果行坐标的值大于等于数据表的行数;或者列坐标的值大于等于数据表的列数,那么返回-1,否则返回0
            cout<<-1<<endl;
        else
            cout<<0<<endl;
    }
    return 0;
}

13、HJ100 等差数列

#include<bits/stdc++.h>
using namespace std;

int getSum(int n,int& sum){
    int res=0;
    if(n==1) res=2;
    else res+=getSum(n-1,sum)+3;
    sum+=res;
    return res;
}

int main(){
    // 获取输入
    int n;
    cin>>n;
    // 递归调用
    int sum=0;
    getSum(n,sum);
    cout<<sum;
}