今天做了华为的三道机试题,比较简单:
题目1
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
题目比较简单,我第一次写的时候以为有多组数据输入,因此没有通过,后来改了输入格式,AC。本题我有两种想法,第一就是while循环直接算,另一种就是找规律,从0个瓶子到10个瓶子,手算一下答案,然后就会发现结果是空瓶数除2即可。
1,2,3,4,5,6,7,8,9,10,11,对应
0,1,1,2,2,3,3,4,4,5,5
代码
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int n;
int bottom[102];
cin >> bottom[0];
int i = 0;
while (bottom[i] != 0)
{
cin >> bottom[++i];
}
for (int j = 0; j < i; j++)
{
n = bottom[j];
int num = 0;
while (n > 2)
{
num += n / 3;
n = (n / 3 + n % 3);
}
if (2 == n)
{
num++;
}
cout << num << endl;
}
return 0;
}
题目2
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
简单的排序,使用sort函数很容易实现。在输出时判断一下是否重复即可。同样第一次提交没有通过,还是输入的问题,这题是多组输入,第一次写了输入一组数据,尴尬。然后看了一下评论,发现一个超级机智的代码,根本不用排序,用一个数组做标记就行了,代码贴在后面(版权是牛客网这道题下面评论第一的人,昵称是:SINGLE、DOG)。
代码
#include<iostream>
//#include<queue>
#include<algorithm>
//#include<math.h>
using namespace std;
int main()
{
int n;
int number[1005];
while (cin >> n)
{
for (int i = 0; i < n; i++)
{
//number[i] = (rand()) % 1000;
cin >> number[i];
}
sort(number, number + n);
int temp = 0;
for (int i = 0; i < n; i++)
{
if (number[i] == temp)
{
continue;
}
cout << number[i] << endl;
temp = number[i];
}
}
return 0;
}
机智代码
#include <iostream>
using namespace std;
int main() {
int N, n;
while (cin >> N) {
int a[1001] = { 0 };
while (N--) {
cin >> n;
a[n] = 1;
}
for (int i = 0; i < 1001; i++)
if (a[i])
cout << i << endl;
}
return 0;
}//阿西吧
题目3
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
直接算就行,做完看评论,有一个人直接用了cin的一个用法直接输出结果,也行。还有就是第一次写的时候忘记将字符数字转化为数字,'3'-'0'
就是数字3了。strlen()
函数的头文件要包含string.h
。
代码
#include<iostream>
#include <string.h>
//#include<queue>
#include<algorithm>
//#include<math.h>
using namespace std;
int main()
{
char number16[200];
while (cin >> number16)
{
int length = strlen(number16);
int power = length-2;
int number10 = 0;
for (int i = 2; i < length; i++)
{
power--;
if ('A' == number16[i])
{
number10 += (10 * pow(16, power));
continue;
}
if ('B' == number16[i])
{
number10 += (11 * pow(16, power));
continue;
}
if ('C' == number16[i])
{
number10 += (12 * pow(16, power));
continue;
}
if ('D' == number16[i])
{
number10 += (13 * pow(16, power));
continue;
}
if ('E' == number16[i])
{
number10 += (14 * pow(16, power));
continue;
}
if ('F' == number16[i])
{
number10 += (15 * pow(16, power));
continue;
}
number10 += ((number16[i]-'0') * pow(16, power));
}
cout << number10 << endl;
}
return 0;
}
总结一下做这几道简单题的感受,就是如果测试样例一组都没有通过,检查完算法后没有大的问题,那么大概率是输入输出的问题。