华为机试真题练习汇总(81~90)
- 华为机试真题练习汇总(81~90)
-
- [HJ81 字符串字符匹配](#HJ81 字符串字符匹配)
- [** HJ82 将真分数分解为埃及分数](#** HJ82 将真分数分解为埃及分数)
- [HJ83 二维数组操作](#HJ83 二维数组操作)
- [HJ84 统计大写字母个数](#HJ84 统计大写字母个数)
- [HJ85 最长回文子串](#HJ85 最长回文子串)
- [HJ86 求最大连续bit数](#HJ86 求最大连续bit数)
- [HJ87 密码强度等级](#HJ87 密码强度等级)
- [* HJ88 扑克牌大小](#* HJ88 扑克牌大小)
- [* HJ89 24点运算](#* HJ89 24点运算)
- [HJ90 合法IP](#HJ90 合法IP)
华为机试真题练习汇总(81~90)
题目来源:华为机试 - 牛客
标记 * 号的代表有难度的题目。
HJ81 字符串字符匹配
描述
判断短字符串S中的所有字符是否在长字符串T中全部出现。
请注意本题有多组样例输入。
输入描述:
输入两个字符串。第一个为短字符串,第二个为长字符串。两个字符串均由小写字母组成。
输出描述:
如果短字符串的所有字符均在长字符串中出现过,则输出字符串"true"。否则输出字符串"false"。
代码:
cpp
#include <iostream>
#include <vector>
using namespace std;
// bool isSubStr(string& s1, string& s2) {
// int len1 = s1.length(), len2 = s2.length();
// for (int i = 0; i <= len2 - len1; i++)
// if (s2.substr(i, len1) == s1)
// return true;
// return false;
// }
bool isAllOccurred(const string& s1, const string& s2) {
vector<bool> dict1(26, false);
for (const char& c : s1)
dict1[c - 'a'] = true;
vector<bool> dict2(26, false);
for (const char& c : s2)
dict2[c - 'a'] = true;
for (int i = 0; i < 26; i++)
if (dict1[i] && !dict2[i])
return false;
return true;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
if (isAllOccurred(s1, s2))
cout << "true" << endl;
else
cout << "false" << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
** HJ82 将真分数分解为埃及分数
描述
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。
输入描述:
输入一个真分数,String型
输出描述:
输出分解后的string
代码:
cpp
#include <iostream>
using namespace std;
int main() {
// a/b = 1/(x+1) + 1/(x+1) * (a-y)/b
// 其中,x = b/a,y = b%a
long a, b; // 分别是分子分母
char op; // 除号
while (cin >> a >> op >> b) {
while (a != 1) { //直到最后的a为1
if (b % a == 0) { //先去掉公因子
b = b / a;
break;
}
//按照公式推算运算
long x = b / a;
long y = b % a;
cout << 1 << op << x + 1 << "+";
a -= y;
b *= x + 1;
}
cout << 1 << op << b << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
HJ83 二维数组操作
描述

输入描述:
输入数据按下列顺序输入:
1 表格的行列值
2 要交换的两个单元格的行列值
3 输入要插入的行的数值
4 输入要插入的列的数值
5 输入要查询的单元格的坐标
输出描述:
输出按下列顺序输出:
1 初始化表格是否成功,若成功则返回0, 否则返回-1
2 输出交换单元格是否成功
3 输出插入行是否成功
4 输出插入列是否成功
5 输出查询单元格数据是否成功
代码:
cpp
#include <iostream>
using namespace std;
int main() {
int row, col; // 表格的行列值
while (cin >> row >> col) {
// 初始化表格是否成功,若成功则返回0, 否则返回-1
if (row > 0 && row <= 9 && col > 0 && col <= 9)
cout << 0 << endl;
else
cout << -1 << endl;
// 交换坐标
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
if (x1 < 0 || x1 >= row || y1 < 0 || y1 >= col
|| x2 < 0 || x2 >= row || y2 < 0 || y2 >= col)
cout << -1 << endl;
else
cout << 0 << endl;
// 在第x行上方添加一行
int x;
cin >> x;
if (x < 0 || x >= row || row >= 9)
cout << -1 << endl;
else
cout << 0 << endl;
// 在第 y 列左边添加一列
int y;
cin >> y;
if (y < 0 || y >= col || col >= 9)
cout << -1 << endl;
else
cout << 0 << endl;
// 查找坐标为 (x,y) 的单元格的值
cin >> x >> y;
if (x < 0 || x >= row || y < 0 || y >= col)
cout << -1 << endl;
else
cout << 0 << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
HJ84 统计大写字母个数
描述
找出给定字符串中大写字符(即'A'-'Z')的个数。
字符串中可能包含空格或其他字符。
输入描述:
对于每组样例,输入一行,代表待统计的字符串
输出描述:
输出一个整数,代表字符串中大写字母的个数
代码:
cpp
#include <cctype>
#include <iostream>
using namespace std;
int main() {
string s;
getline(cin, s);
int count = 0;
for (char& c : s)
if (isupper(c))
count++;
cout << count << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ85 最长回文子串
描述
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
所谓回文串,指左右对称的字符串。
所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串
输入描述:
输入一个仅包含小写字母的字符串
输出描述:
返回最长回文子串的长度
代码:
cpp
#include <iostream>
using namespace std;
int palindromeLength(string& s, int low, int high) {
while (low >= 0 && high < s.length() && s[low] == s[high]) {
low--;
high++;
}
int len = high - low - 1;
return len;
}
int main() {
string s;
cin >> s;
int maxLen = 1;
for (int i = 1; i < s.length() - 1; i++) {
int len1 = palindromeLength(s, i, i);
int len2 = palindromeLength(s, i, i + 1);
if (max(len1, len2) > maxLen)
maxLen = max(len1, len2);
}
cout << maxLen << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ86 求最大连续bit数
描述
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
输入描述:
输入一个int类型数字
输出描述:
输出转成二进制之后连续1的个数
代码 1:
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int count = 0, max_count = 0;
while (n) {
if (n % 2 == 1) // 最后一位为1
count++;
else { // 遇到不为1
max_count = max(max_count, count); // 更新最大值
count = 0; // 重置
}
n /= 2; // 去掉最后一位
}
max_count = max(max_count, count); // 最后一次更新最大值
cout << max_count << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
代码 2:
cpp
#include<iostream>
using namespace std;
int main() {
int n;
while (cin >> n) {
int count = 0;
for (; n != 0; count++) // 统计能够运算多少次
n &= n << 1; // 与自己左移一位后比较
cout << count << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
HJ87 密码强度等级
描述
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 密码里的字母全都是小(大)写字母
20 分: 密码里的字母符合"大小写混合"
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励(只能选符合最多的那一种奖励):
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号
最后的评分标准:
>= 90: 非常安全
>= 80: 安全(Secure)
>= 70: 非常强
>= 60: 强(Strong)
>= 50: 一般(Average)
>= 25: 弱(Weak)
>= 0: 非常弱(Very_Weak)
对应输出为:
VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK
请根据输入的密码字符串,进行安全评定。
注:
字母:a-z, A-Z
数字:0-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./ (ASCII码:0x21~0x2F)
:;<=>?@ (ASCII码:0x3A~0x40)
\]\^_\` (ASCII码:0x5B\~0x60)
{\|}\~ (ASCII码:0x7B\~0x7E)
提示:
1 \<= 字符串的长度\<= 300
**输入描述:**
输入一个string的密码
**输出描述:**
输出密码等级
代码:
```cpp
#include