[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;
}