华为23年5月6日机试(前两题)
=================一些心里话=================
我现在真的很难受,华为机试必须要150分以上才能通过,但是我考试的时候只写出来第一题(83%)
第二题在考试结束10min之后才写出来
这意味着自己与华为无缘了,心里真的很难受,为什么这么笨,为什么考试的时候写不出来,为什么考试的时候不先做分高的题目。
不管怎么说,通过这次考试还是知道了自己与企业要求的差距,看来我现在还是没达到要求。
没关系,过去了就过去了,之后还要继续努力!
===================下面是正文===================
第一题题目是说:
有一个墨盒,用一维数组表示,值为0或者1。
1表示墨盒对应位置是好的,0表示对应位置是坏的。
当我们打印东西的时候,用好的地方打印没有问题,但是用坏的地方打印就会出错。
现在想出来一种补偿算法,即打印两次,第二次打印第一次没打印好的地方。
第二次打印的时候,会将墨盒向左或者向右平移x个单位长度,再重新打印。
要求第二次打印的时候,如果原来是好的地方,不重新打印,只打印错误的地方。
现在求第二次打印的时候,墨盒应该使能的位置(用一个一维数组表示,0表示不使能,1表示使能)
输出格式:
如果向左右平移都能成功,取平移单位最少的两个方案输出。
如果向左或者向右能成功,输出那个平移单位最少的方案。
如果没有方案,输出零。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1050;
int h1[N], h2[N], h3[N];
int n;
int main()
{
scanf("%d", &n);
int count = n;
int idx = 1;
while (count > 0)
{
char op[7];
scanf(" %s", &op);
for (int i = 2; i <= 5; i++)
{
char o = op[i];
int t = 0;
if (o >= '0' && o <= '9')
t = o - '0';
else
t = o - 'A' + 10;
h1[idx++] = (t & 8) >> 3;
h1[idx++] = (t & 4) >> 2;
h1[idx++] = (t & 2) >> 1;
h1[idx++] = t & 1;
}
count -= 16;
}
int rf = -1, lf = -1;
int fcnt = 0;
for (int i = 1; i <= n; i++)
if (h1[i] == 0)
{
if (rf == -1)
rf = i;
fcnt++;
}
for (int i = n; i > 0; i--)
{
if (h1[i] == 0)
{
lf = i;
break;
}
}
if (rf == -1)
printf("0");
else
{
bool flag1 = false;
int offset1 = 0;
int tempcnt = 0;
for (int offset = 1; offset < rf; offset++)
{
tempcnt = 0;
memset(h2, 0, sizeof h2);
for (int i = rf; i <= lf; i++)
{
if (h1[i] == 0 && h1[i - offset] == 1)
{
h2[i - offset] = 1;
tempcnt++;
}
}
if (tempcnt == fcnt)
{
flag1 = true;
offset1 = offset;
break;
}
}
bool flag2 = false;
int offset2 = 0;
tempcnt = 0;
for (int offset = 1; offset < lf; offset++)
{
tempcnt = 0;
memset(h3, 0, sizeof h3);
for (int i = lf; i >= rf; i--)
{
if (h1[i] == 0 && h1[i + offset] == 1)
{
h3[i + offset] = 1;
tempcnt++;
}
}
if (tempcnt == fcnt)
{
flag2 = true;
offset2 = offset;
break;
}
}
if (flag1 && flag2)
{
printf("2\n");
printf("+%d\n", offset1);
for (int i = 1; i <= n; i++)
printf("%d", h2[i]);
printf("\n-%d\n", offset2);
for (int i = 1; i <= n; i++)
printf("%d", h3[i]);
}
else if (flag1)
{
printf("1\n");
printf("+%d\n", offset1);
for (int i = 1; i <= n; i++)
printf("%d", h2[i]);
}
else if (flag2)
{
printf("1\n");
printf("-%d\n", offset2);
for (int i = 1; i <= n; i++)
printf("%d", h3[i]);
}
else
{
printf("0");
}
}
return 0;
}
第二题:
讲的是两个“数”相加(有整数部分和小数部分)
“数”由0-9和'!','@','#'组成
题目规定了两个特殊字符相加得到的值,而且保证不会出现数字+特殊字符的情况
求最后的结果?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1010;
char op[N];
int n;
int add(char a, char b)
{
if (a == '!' && b == '!')
return 0;
if (a == '!' && b == '@')
return 13;
if (b == '!' && a == '@')
return 13;
if (a == '!' && b == '#')
return 4;
if (b == '!' && a == '#')
return 4;
if (a == '@' && b == '@')
return 7;
if (a == '@' && b == '#')
return 20;
if (b == '@' && a == '#')
return 20;
if (a == '#' && b == '#')
return 5;
return 1e9;
}
int main()
{
scanf("%d", &n);
scanf(" %s", op);
vector<char> a1, a2, b1, b2;
vector<int> ans1, ans2;
bool flag = false;
bool flag1 = false;
bool flag2 = false;
for (int i = 0; i <= n; i++)
{
if (op[i] == '+')
{
flag = true;
continue;
}
if (!flag)
{
if (op[i] == '.')
{
flag1 = true;
continue;
}
if (!flag1) // 整数
a1.push_back(op[i]);
else
a2.push_back(op[i]);
}
else
{
if (op[i] == '.')
{
flag2 = true;
continue;
}
if (!flag2) // 整数
b1.push_back(op[i]);
else
b2.push_back(op[i]);
}
}
int s = max(a1.size(), b1.size());
while (a1.size() != s)
a1.push_back('0');
while (b1.size() != s)
b1.push_back('0');
reverse(a1.begin(), a1.end());
reverse(b1.begin(), b1.end());
int t = 0;
for (int i = 0; i < s; i++)
{
if (a1[i] >= '0' && b1[i] <= '9')
{
t += (a1[i] - '0');
t += (b1[i] - '0');
}
else
t += add(a1[i], b1[i]);
ans1.push_back(t % 10);
t /= 10;
}
while (t)
{
ans1.push_back(t % 10);
t /= 10;
}
reverse(ans1.begin(), ans1.end());
s = max(a2.size(), b2.size());
while (a2.size() != s)
a2.push_back('0');
while (b2.size() != s)
b2.push_back('0');
reverse(a2.begin(), a2.end());
reverse(b2.begin(), b2.end());
t = 0;
for (int i = 0; i < s; i++)
{
if (a2[i] >= '0' && b2[i] <= '9')
{
t += (a2[i] - '0');
t += (b2[i] - '0');
}
else
t += add(a2[i], b2[i]);
ans2.push_back(t % 10);
t /= 10;
}
reverse(ans2.begin(), ans2.end());
if (t)
{
reverse(ans1.begin(), ans1.end());
for (int i = 0; i < ans1.size(); i++)
{
t += ans1[i];
ans1[i] = t % 10;
t /= 10;
}
while (t)
{
ans1.push_back(t % 10);
t /= 10;
}
reverse(ans1.begin(), ans1.end());
}
for (int i = 0; i < ans1.size(); i++)
printf("%d", ans1[i]);
printf(".");
for (int i = 0; i < ans2.size(); i++)
printf("%d", ans2[i]);
return 0;
}
