京东笔试题目复盘,前端开发的笔试题,包括选择题 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 个数按顺序分别表示每组数据的答案
样例输入
2
5 1
6 2
5 7
样例输出
1 2
提示
第一组数据,输入 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
每次可以有以下两种操作:
- ++x
- if(x%3 == 0) x /= 3
使 x 变为 y 最少需要多少步?
这里给几个自己造的测试样例
样例 1
3
102 1
312 12
23 10
10
5
4
样例 2
4
210 4
121 3
312 102
281 200
8
10
70
108
样例 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; | |
} |