空汽水瓶

今天做了华为的三道机试题,比较简单:

题目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;
}

       总结一下做这几道简单题的感受,就是如果测试样例一组都没有通过,检查完算法后没有大的问题,那么大概率是输入输出的问题。

猜你喜欢

转载自blog.csdn.net/zhang_han666/article/details/79958369