2017美团秋招笔试编程题——后台研发

1、求所有能被7整除的数字
2017美团秋招笔试编程题——后台研发_第1张图片
分析:
方法一:采用暴力解法,即两两数字都组合一遍对7取余判断的方法,算法复杂度O(n2),会超时,提交成功率为70%。
方法二:求一个数A前面拼接上什么数能够被7整除,只需进行以下操作即可:
①数A前面依次拼上0~6,变为0A,1A,2A···6A。
②依次判断这7个数能否被7整除
②以1A为例,若1A等被7整除,则A前面拼的数B,只要满足B%7==1,则BA能被7整除,因为B%7==1,所以BA总能转化为1A,即BA也能被7整除。
代码如下:

#include 
using namespace std;
const int maxN = 100001;
int a[maxN];
int sum[7];//记录余数0-6的数的个数
int getlen(int x)//求一个数的长度
{
    if (x == 0) return 1;
    int ans = 0;
    while (x>0)
    {
        x /= 10;
        ans++;
    }
    return ans;
}
long long fuck(int x, int y)//将数x乘上10的y次方,为了连接两个数用
{
    long long ans = x;
    while (y--)
    {
        ans *= 10;
    }
    return ans;
}
int main()
{
    int n;
    while (cin >> n)
    {
        int totalNum = 0;
        memset(sum, 0, sizeof(sum));
        for (int i = 0; i < n; i++)
        {
            cin >> a[i];
            sum[a[i] % 7]++;
        }
        for (int i = 0; i < n; i++)
        {
            sum[a[i] % 7]--;
            for (int j = 0; j < 7; j++)//此方法的精髓所在,分析见上文
            {
                long long num = fuck(j, getlen(a[i])) + a[i];
                if (num % 7 == 0)
                {
                    totalNum += sum[j];
                }
            }
            sum[a[i] % 7]++;
        }
        cout << totalNum << endl;
    }
}

2、点灯泡比赛
2017美团秋招笔试编程题——后台研发_第2张图片
这道题还没有理清楚,做的时候写了几个案例发现最后一个灯泡如果为‘1’则Alice赢,为‘0’则Bob赢,尝试了下就AC了。
代码如下:

#include 
using namespace std;
int main()
{
    int n;
    int flag;
    vector<int> v;
    while (cin >> n)
    {
        for (int i = 0; i < n; i++)
        {
            cin >> flag;
            v.push_back(flag);
        }
        if (v[n - 1] == 1)
            cout << "Alice" << endl;
        else
            cout << "Bob" << endl;
    }
}

你可能感兴趣的:(各公司秋招笔试编程题)