什么?我竟然三题都没过?!
由于近期要参加华为的笔试,所以专门在牛客网上找了华为的笔试题,简单到我不敢相信——比起我参加的上一次笔试来说。
然而,我三题都没过:>
问题都出在输入输出。
汽水瓶:有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
这道题,我虽然没看出最简方法——空瓶数除以2,但至少我会基本的方法:
#include<iostream>
using namespace std;
int main()
{
int n, count, trade,i,j;
int data;
data = (int*)malloc(10 * sizeof(int));
count = 0;
trade = 0;
i = 0;
j = 0;
cin >> n;
while (n)
{
if (n < 1 || n > 100)
{
cin >> n;
continue;
}
data[i] = n;
i++;
cin >> n;
}
j = i;
for (i = 0; i < j; i++)
{
count = 0;
n = data[i];
while (n != 1 && n != 2)
{
trade = n / 3;
count += trade;
n = n % 3 + trade;
}
if (n == 2)
{
count++;
cout << count << endl;
}
else
cout << count << endl;
}
free(data);
return 0;
}
如今反思一下,写的确实是麻烦了,此处指针数组完全没必要。但真正致死的,是牛客网黑箱测试的输入输出模式。对于一个输入,需要立即给出输出,而不是等待全部输入结束后一起输出。关于在内部有break条件下while语句不可用true进行死循环的问题,我还是百思不得其解。没有深入研究,姑且认为while(cin >> n)
是标配吧。
while(cin >> n)
{
if(!n)
break;
count = 0;
//n = data[i];
while (n != 1 && n != 2)
{
trade = n / 3;
count += trade;
n = n % 3 + trade;
}
if (n == 2)
{
count++;
cout << count << endl;
}
else
cout << count << endl;
}
明明的随机数:明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
这道题乍一看,简单吧,hash表就解决了。
*#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n, i, temp;
cin >> n;
int *data;
data = (int*)malloc(1001 * sizeof(int));
memset(data, -1, 1001*sizeof(int));
for (i = 0; i < n; i++)
{
cin >> temp;
data[temp] = 1;
}
for (i = 0; i <= 1000; i++)
{
if (data[i] == 1)
cout << i << endl;
}
return 0;
}
编译是通过了,但输出为空。我将它给的测试用例——288个数字放在本地vs上试了一下,结果完全相同。我寻思是不是因为,它同时给了好几组随机数字,但随即我又觉得太麻烦了,怎么把每组的n提取出来?
直到看到讨论才发现,没错,就是因为它。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
int data[1001];
while(cin>>n) //每组测试数据
{
memset(data,0,sizeof(data));
int num;
while(n--) //取每组的数字
{
cin>>num;
data[num]=1;
}
for(int i=1;i<=1000;i++)
{
if(data[i]) cout<<i<<endl;
}
}
return 0;
}
好吧,我标题党了。第三题是十六进制转十进制的题目,总共一个小时的时间,被前面两个错误坑得我还没敲完这道题就结束了。看到评论里的解法,我觉得还是有必要放上来的,当涨涨见识。
#include <iostream>
using namespace std;
int main()
{
int a;
while(cin>>hex>>a){
cout<<a<<endl;
}
}
后来又看到这道题应该要考虑大数的说法,感觉很对。当年那个敏锐得要死的我不知道到哪里去了。但不太知道如果十六进制数超过long long可表达的数的上限,该怎么答。姑且放在这里。