京东2018秋招编程题

第一题:疯狂的序列

有一个序列1,2,2,3,3,3,4,4,4,4,5,5,5,5,5....,求第n项是多少?


解法一:暴力法,i从1开始穷举,直到满足i(i+1)/2-i

#Include

int main()

{

long long n;

while (scanf("%lld", &n) != EOF) {

long long i = 1;

while (1) {

if (n > (i*(i+1)/2-i) && n <= i*(i+1)/2) {

printf("%lld\n, i);

break;

}

}

}

 return 0;

}

这种做法直接超时,通过率90%.

解法二:二分法,代码如下:

#include
using namespace std;
 
long long n;
 
int main() {
    cin >> n;
    long long l = 1, r = 2000000000LL, mid;
    while(l < r) {
        mid = (l + r) / 2;
        if(mid * (mid + 1) / 2 >= n)
            r = mid;
        else
            l = mid + 1;
    }
    cout << l << endl;
    return 0;
}

第二题:神奇的数

如果一个数字拆分之后,分成两组,如果两组的和相等,则为申请的数,例如2323是一个神奇的数,可以分为(2,3),(2,3)两组且和都为5.

解法一:暴力法,拆分之后存在一个数组里面,然后全排列,check两组是否相等即可。

#include
#include
#include
using namespace std;

int main()
{
    int l, r;
    int ans;
    int flag;

    while (cin >> l >> r) {
        ans = 0;
        for (int i = l; i <= r; i++) {
            int tmp = i;
            flag = 0;
            vector vec;
            while (tmp) {
                vec.push_back(tmp%10);
                tmp /= 10;
            }
            if (vec.size() < 2) {
                vec.clear();
                continue;
            }
            sort(vec.begin(), vec.end());
            do {
                for (int j = 0; j < vec.size() - 1; j++) {
                    long long part1 = 0;
                    long long part2 = 0;
                    for (int m = 0; m <= j; m++)
                        part1 += vec[m];
                    for (int k = j + 1; k < vec.size(); k++)
                        part2 += vec[k];
                    if (part1 == part2) {
                        ans++;
                        vec.clear();
                        flag = 1;
                        break;
                    }
                }
                if (flag)
                    break;
          } while ((next_permutation(vec.begin(), vec.end())));
        }
        cout << ans << endl;
    }
    return 0;
}


解法二:直接在数组里面寻找是否有和为所有数字和的一般的数,不需要全排列,时间复杂度降低很多。代码如下:

#include
#include
#include
#include
using namespace std;

// 求出数组里是否存在 n 个数的和等于某个值 SUM
bool Is_Sum_SomeData(vectordata, unsigned int SUM)
{
    // 异常输入
    int length = data.size();
    sort(data.begin(), data.end());
    // 创造辅助工具栈 来寻找某些值
    // 对栈初始化
    unsigned int _sum = 0;
    stackS;

    S.push(0);
    _sum = data[0];
    unsigned int now = S.top();

    // 核算算法
    while (true)
    {
        // 进栈决策
        if (_sum < SUM)
        {
            // 有元素可以进栈
            now++;
            if (now < length)
            {
                S.push(now);
                _sum += data[now];
            }
            // 没有元素可以进栈
            else{
                // 出口:并且栈空了,那就没有答案了
                if (S.empty() == true)
                {
                    return false;
                }
                // 栈不空时,把栈顶后移一位
                else{
                    now = S.top();
                    S.pop();
                    _sum -= data[now];
                }
            }
        }
        // 出栈决策
        else if (_sum > SUM)
        {
            // 出口:只有一个值,并且还大于要求的和,那就没有答案了
            if (S.size() < 2)
                return false;
            // 否则出栈寻找个数更小,数更大的值去做
            // 出栈两个(进栈一个)
            else
            {
                _sum -= data[S.top()];
                S.pop();
                _sum -= data[S.top()];
                now = S.top();
                S.pop();
            }
        }
        // 出口:找到答案
        else {
            return true;
        }
    }
}

int main()
{
    long long l, r, tmp;
    int ans;
    int res;
    vector vec;
    while (cin >> l >> r) {
        ans = 0;
        for (long long i = l; i <= r; i++) {
            res = 0;
            vec.clear();
            tmp = i;
            while (tmp) {
                res += tmp%10;
                vec.push_back(tmp%10);
                tmp /= 10;
            }
            if (vec.size() < 2)
                continue;
            if (res % 2 == 1)
                continue;
            if (Is_Sum_SomeData(vec, res/2))
                    ans++;
        }
        cout << ans << endl;
    }
    return 0;
}

你可能感兴趣的:(编程题)