首页 > 代码库 > 2017京东笔试总结

2017京东笔试总结

第一题,给一个数A,求A用2-A-1进制表示的所有数的每一位的总和的平均数。

比如5,则用2进制表示为101;3进制表示为12;4进制表示为11,则所有数的总和为1+0+1+1+2+1+1 = 7

平均数为7/3要求表示成不可约分的形式。

思路比较简单辗转相除的方法,求出每一个进制表示的数各个位的总和,然后除以总的个数,这边最需要注意的一个点就是,最后的结果是要表示成不可约分的形势,因此在输出结果时候,还要除以分子和分母的最大公约数。

#include <iostream>#include <vector>using namespace std;int greatDivisor(int num1, int num2) {	if (num1 > num2) {		return greatDivisor(num1 - num2, num2);	}	else if (num2 > num1) {		return greatDivisor(num1, num2 - num1);	}	else		return num1;}int main() {	int A = 0;	while (cin >> A) {		long long sum = 0;		for (int i = 2; i < A; i++) {			int temp = A;			while (temp) {				sum += temp%i;				temp /= i;			}		}		int Commondivisor = greatDivisor(sum, A - 2);		cout << sum / Commondivisor << "/" << (A - 2) / Commondivisor << endl;	}}

  

第二题:小明有一堆爬上的数据,m和n,m表示第几天,n表示他当天爬的海拔高度,要求是相邻两天的高度差不超过1,并且第一天和最后一天的高度可以是任意输入,他遗失了这份数据中的一部分,问你能不能通过没有遗失的数据求出他可能爬的最高海拔,如果可以输出可能的最高海拔,如果不行,输出“IMPOSSIBLE”;

比如

8 2

2 0

7 0 

上面这组数据表示他一共有8天的数据,没有遗失的数据有2天,分别是第2天海拔0,第7天海拔0,则可以发现,如果高度差不超过1,则第4天或者第5天的海拔最高为2,可能的情况为(2,0)(3,1 )(4,2)(5,2 )(6,1) (7,0)

则按要求输出为2

8 3

2 0

7 0

8 3

对于这组数据,由于第7天和第8天相邻两天高度差超过了1,所以输出IMPOSSIBLE

这道题我没有AC,当时想错了一个地方,其实和第一组测试数据很有关系,由于第一组测试数据刚好2,7都为0,并且最高高度为两天的中间那天,所以我简单的把最高高度换乘了0+(7-2)/2,其实这样是不对的,其实这题真的非常简单初中的知识,画一个图解方程就明白了。

技术分享

这样最大高度的公式就很容易表示了,还需要考虑第一天和最后一天可能的高度,然后再求出最大值。当时被(2,0) (7,0)这两对数据误导,一直没有AC

当然下面的代码我也不保证能够AC。。。。哈哈哈~等下次题目有了再提交看看,如果有什么问题的话欢迎给我留言。

#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() {	int day;	int unmissDay;	cin >> day;	cin >> unmissDay;	vector<pair<int,int>> dayInfo(unmissDay);	for (int i = 0; i < unmissDay; i++) {		int oneday; //日期		int oneheight; //高度		cin >> oneday;		cin >> oneheight;		dayInfo[i] = make_pair(oneday,oneheight);	}	int maxheight = 0;	bool flag = true;	for (int i = 1; i < unmissDay; i++) {		if (dayInfo[i].first - dayInfo[i - 1].first < abs(dayInfo[i].second - dayInfo[i - 1].second))		{			flag = false;			break;		}		maxheight = max(maxheight, (dayInfo[i - 1].second + abs(dayInfo[i].second - dayInfo[i - 1].second + dayInfo[i].first - dayInfo[i - 1].first) / 2));	}	maxheight = max(maxheight, max(dayInfo[0].second + dayInfo[0].first - 1, dayInfo[unmissDay - 1].second + unmissDay - dayInfo[unmissDay - 1].first));	//需要考虑第一天和最后一天的高度	if (flag) {		cout << maxheight << endl;	}	else {		cout << "IMPOSSIBLE" << endl;	}}

  

2017京东笔试总结