京东笔试题目复盘,前端开发的笔试题,包括选择题30道与两道编程(跟360还恰好在同一天,蚌,一天两场笔试)
选择题(30道)
啥都考,巴拉巴拉巴拉的,数据库啊高数啊方程啊,后半段前端题居多。
编程题-1 小明的最大值(AC100%)
小明有一台机器,每次输入一个数就会返回一个非负整数。经过小明的多次试验,知道了如果给这台机器一个数x,机器会返回这个数除以P的余数y,而P刻在这台机器的下方,小明可以查看到。
例如当P=5时,输入x=9机器会返回4,输入15时会返回0。
小明现在可以输入[L,R]这个闭区间内所有的整数,问小明能从这台机器中得到的最大的返回值是多少。
输入描述 有多组数据。第一行一个数T表示数据组数
接下来三行,每一行有T个整数L[i],R[i],P[i],L[i],R[i],P[i]表示第i组数据的区间左端点,右端点,和机器的参数P
输出描述 输出一行T个数按顺序分别表示每组数据的答案
样例输入
样例输出
提示 第一组数据,输入5可以得到0,输入6可以得到1,因此答案为1
第二组数据,输入1可以得到1,输入2可以得到2,因此答案为2
思路
显而易见,题意为在 L~R
中找一个数 x
,使得 x%p
最大,那么判断一下 L/p
是否等于 R/p
,若等于则肯定是 R%p
,否则,肯定已经余过一轮了,最大余数就是 p-1
。
代码
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 70005;
int T;
int L[maxn], R[maxn], P[maxn];
vector<int> ans;
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> T;
for(int i = 0; i < T; ++i)
cin >> L[i];
for(int i = 0; i < T; ++i)
cin >> R[i];
for(int i = 0; i < T; ++i)
cin >> P[i];
for(int i = 0; i < T; ++i) {
int l = L[i], r = R[i], p = P[i];
if(l/p == r/p) ans.push_back(r%p);
else ans.push_back(p-1);
}
for(int i = 0; i < T; ++i) {
if(i == 0) cout << ans[i];
else cout << ' ' << ans[i];
}
cout << endl;
return 0;
}
编程题-2 分鸡蛋(AC 73%)
说人话就是: 初始x 每次可以有以下两种操作:
if(x%3 == 0) x /= 3 使x变为y最少需要多少步? 这里给几个自己造的测试样例 样例1
样例2
4
210 4
121 3
312 102
281 200
样例3
4
299 298
31 100
8 1
900100000000000000 20000200000100000
200
69
3
8887854321087664
好,开始分析
思路
每次尽可能让其x/=3,若x/3会小于y的话,则将其加至目标数 若x/=3后无法被3整除且大于y,则加1~3使其变为可以被3整除再往下除。 最后不是TLE了而是WA,我也没找出来可能哪里还有边界问题,过了73%
代码
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 70005;
typedef long long ll;
int T;
ll x, y;
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> T;
while(T--) {
cin >> x >> y;
ll cnt = 0;
while(x != y) {
while (x != y && x % 3 == 0 && x/3 >= y) {
x /= 3;
++cnt;
}
if(x == y) break;
if(x % 3 == 0) x /= 3,++cnt;
if(x < y) { // 加到目标数
cnt += y-x;
break;
} else {
while(x != y && x % 3 != 0) { // 最多加三次
++x, ++cnt;
}
}
}
cout << cnt << endl;
}
return 0;
}