什么?我竟然三题都没过?!

由于近期要参加华为的笔试,所以专门在牛客网上找了华为的笔试题,简单到我不敢相信——比起我参加的上一次笔试来说。

然而,我三题都没过:>

问题都出在输入输出。

汽水瓶:有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是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可表达的数的上限,该怎么答。姑且放在这里。

posted @ 2020-04-13 23:16  兔至  阅读(98)  评论(0编辑  收藏  举报