您的位置:首页 > 其它

2018京东笔试

2017-09-10 21:33 483 查看
第一题是老题了 数学大佬应该一眼就看出来了 可以O(1).

点击这里

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

int main()
{
string temp;
cin >> temp;

long long val = std::stoll(temp);
long long n = ( 1 + sqrt(1 + 8*val) )/2;
cout << n << endl;
return 0;
}


第二题

我没想出什么好的算法,就直接用暴力破解,

思路:把每一位的数取出来放在数组并且将每一位相加的sum,如果sum是奇数就不是神奇数,sum是偶数就先排序然后暴力凑sum的一半。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool qiujie(vector<int>& v, int s, int half)
{
if (half == 0) return true;
if (half < 0) return false;
for (int i = s; i < v.size(); ++i)
{
if (half - v[i] < 0) return false;
if (qiujie(v, i + 1, half - v[i])) return true;
}
r
4000
eturn false;
}
bool countNum(long int n)
{
vector<int> v;
int sum = 0;
int half;
while (n)
{
sum += n % 10;
v.push_back(n % 10);
n /= 10;
}
if (sum % 2 || v.size() < 2) return false;
half = sum / 2;
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); ++i)
{
if (qiujie(v, i + 1, half - v[i])) return true;
}
return false;

}

int main()
{
long int l, r;
while (cin >> l >> r)
{
int count = 0;
for (long int i = l; i <= r; ++i)
{
if (countNum(i)) ++count;
}
cout << count << endl;
}

return 0;
}


这样的时间复杂度太高我去查了一下,在leetcode上的题目,发现别人写的代码再看了看自己写的代码,简直没法比较。大概这就是大佬吧。可以转化为背包问题,时间复杂度为O(1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: