[网易]2018校园招聘编程题真题集合

题目: 
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。 
参考答案:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int start = 0, end = 0;
    while (end < n)
    {
        start = 2 * start + 1;
        end = 2 * end + 2;
    }

    while (true)
    {
        int middle = (start + end) / 2;
        if (n <= middle)
        {
            cout << '1';
            end = middle;
        }
        else
        {
            cout << '2';
            start = middle + 1;
        }
        if (start == end)
            break;
    }
    cout << endl;
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

题目: 
为了得到一个数的”相反数”,我们将这个数的数字顺序颠倒,然后再加上原先的数得到”相反数”。例如,为了得到1325的”相反数”,首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1. 
参考代码:

#include <iostream>
using namespace std;

int func(int n)
{
    int temp = n;
    int len = 0;
    int pow = 1;
    while (temp > 0)
    {
        len++;
        pow *= 10;
        temp /= 10;
    }
    temp = n;
    for (int i = 0; i < len; i++)
    {
        pow /= 10;
        n += (temp % 10)*pow;
        temp /= 10;
    }
    return n;
}

int main()
{
    int n;
    cin >> n;
    cout << func(n) << endl;
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

题目: 
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,”aaabbaaac”是由下面碎片组成的:’aaa’,’bb’,’c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。 
参考代码:

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main()
{
    int count = 0;
    int len = 0;
    int start = 0;
    int i;
    string s;
    cin >> s;
    for (i = 1; i < s.length(); i++)
    {
        if (s[i] != s[start])
        {
            count++;
            len += i - start;
            start = i;
        }
    }
    if (s[i - 1] == s[start])
    {
        count++;
        len += i - start;
    }
    else
    {
        count++;
        len += 1;
    }
    cout << fixed << setprecision(2) << 1.0 * len / count << endl;
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

题目: 
小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]…, A[N]}。 
牛博士给小易出了一个难题: 
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。 
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。 
参考代码:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        vector<vector<int>> state(3, vector<int>(0));
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            int temp;
            cin >> temp;
            if ((temp & 3) == 0)
            {
                state[2].push_back(temp);
            }
            else
                if ((temp & 1) == 0)
                {
                    state[1].push_back(temp);
                }
                else
                {
                    state[0].push_back(temp);
                }
        }
        if (state[2].size() >= state[0].size())
        {
            cout << "Yes" << endl;
        }
        else
            if (state[2].size() == state[0].size() - 1)
            {
                if (state[1].size() == 0)
                {
                    cout << "Yes" << endl;
                }
                else
                {
                    cout << "No" << endl;
                }
            }
            else
            {
                cout << "No" << endl;
            }
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值