banner
cos

cos

愿热情永存,愿热爱不灭,愿生活无憾
github
tg_channel
bilibili

2022年春季京东前端筆試題目複盤

京東筆試題目複盤,前端開發的筆試題,包括選擇題 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;
}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。