【笔试】2023年秋招部分笔试(JD,58、MI,B站,雷火)

文章目录

这边的笔试都是带选择题的,编程题部分占比只有一半上下。

我这里主要只记录下算法题部分的,毕竟单选多选反正408我直接乱选(逃

1、京东笔试

2023.09 后端开发

没记住是哪一场,找不到题面了,就存了个代码(

单选(408):13*2=26

多选(C++):7*2=14

代码:15+20+25=60 (60/60)

cpp 复制代码
//T1, 15/15
#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
    int n, k;  cin>>n>>k;
    priority_queue<int>q;
    for(int i = 1; i <= n; i++){
        int x;  cin>>x;
        q.push(x);
    }
    int res = 0;
    while(q.size()>=2){
        vector<int>vc;
        int a = q.top(); q.pop();
        while(a-q.top()>k){
            a = q.top();  q.pop();
        }
        res += a*q.top();  q.pop();
    }
    cout<<res<<"\n";
    return 0;
}
cpp 复制代码
//T2-20/20
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5+10;
int a[maxn], f[maxn];

signed main() {
    int n;  cin>>n;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
    }
    for(int i = 2; i <= n; i++){
        f[i] = a[i]+min(f[i-1],f[i-2]);
    }
    cout<<f[n]<<"\n";
    return 0;
}
cpp 复制代码
//T3-25/25
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7;
const int maxn = 1e5+10;
int a[maxn], p[maxn];

signed main() {
    ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
    int n;  cin>>n;
    int res = 0;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
    }
    p[1] = 1;
    for(int i = 2; i <= n; i++){
        p[i] = p[i-1]+i;
    }
    for(int i = 1; i <= n; i++){
        res += a[i]*(n-i+1)*p[i]%mod;
        res %= mod;
        // for(int j = 1; j <= i; j++){
        //     res += a[i]*j*(n-i+1);
        //     // res = (res+a[i]*j%mod*(n-i+1)%mod)%mod;
        // }
    }
    cout<<res%mod<<"\n";
    return 0;
}

2、58笔试(dp)

后端开发 A卷 9/16。

选择题个人感觉只做出来一半左右,不过参考 华五✌🏻AK也没面试.jpg, 感觉平衡了。

单选题, 14*3=42, 简单408

多选题:6*3=18,简单408+DB

程序题:40分

cpp 复制代码
//T1-AC, 10/10分
#include <algorithm>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算需要的分数线
     * @param m int整型 晋级和淘汰数量闭区间左值
     * @param n int整型 晋级和淘汰数量闭区间右值
     * @param scores int整型vector 候选项目组分数
     * @return int整型
     */
    int calculate(int m, int n, vector<int>& scores) {
        sort(scores.begin(), scores.end());
        for(int i = 0; i < scores.size(); i++){
            int a = i+1, b = scores.size()-a;
            if(a>=m && a<=n && b>=m && b<=n){
                return scores[i];
            }
        }
        return -1;
    }
};
cpp 复制代码
//T2:输出size,50%,5/10分
// 排序后二分, 10/10分
#include <algorithm>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int maximumScore(vector<int>& nums, int k) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int mi = nums[0];
        int mx = nums[n-1];
        int res = 1;
        for (int i = mi; i <= mx; i++) {
            int l = lower_bound(nums.begin(), nums.end(), i-k)-nums.begin();
            int r = upper_bound(nums.begin(), nums.end(), i+k)-nums.begin();
            res = max(res, r-l);
        } 
        return res;
    }
};
cpp 复制代码
//T3-输出0, 57%,10/20分
//T3 背包dp,20/20分
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param source string字符串 
     * @param pattern string字符串 
     * @return int整型
     */
    int subsequence(string source, string pattern) {
        int m = source.size(); int n = pattern.size();
        vector<int> f(n+1);
        for (int i = 0; i < m; i++) {
            for (int j = n-1; j >= 0; j--) {
                if (source[i] == pattern[j]) {
                    if(j == 0) f[j+1]++;
                    else f[j+1] = f[j+1]+f[j];
                }
            }
        }
        return f[n];
    }
};

3、B站笔试(sql/leetcode)

后端开发,2023年8月29日

B站据说AK的也是笔试未通过,引用1引用2,平衡了

单选: 10x2 = 20,基本都是go运行结果

多选:10x3 = 30,408,比较难,但是估计原题

代码:10+20+20=50

sql 复制代码
//T1, 10, sql
CREATE TABLE uploader_video_record (
    video_id BIGINT PRIMARY KEY,
    uploader_id BIGINT,
    video_duration int
);

INSERT INTO uploader_video_record (video_id, uploader_id, video_duration)
VALUES
 (1, 101, 60),
(2, 102, 600),
(3, 103, 310),
(4, 101, 120),
(5, 104, 3200),
(6, 102, 330),
(7, 103, 290),
(8, 105, 290),
(9, 101, 180),
(10, 103, 320);

-- 题目:请在UP主视频数据表中,筛选发布视频平均时长大于300秒的UP主,按UP主视频平均时长倒序,视频ID升序,返回第3行到6行的视频ID。
-- 要素:up主平均时长大于300秒,时长倒叙ID升序,3-6行的视频id。

SELECT 
uploader_video_record.video_id
FROM (
  SELECT 
    uploader_id,
    AVG(video_duration) AS avg_time
  FROM uploader_video_record
  GROUP BY uploader_id    -- 按up主分组
  HAVING AVG(video_duration) > 300  -- 平均时长大于300秒
) AS tmp
LEFT JOIN uploader_video_record ON tmp.uploader_id = uploader_video_record.uploader_id
ORDER BY avg_time DESC, video_id ASC  -- 两个排序
LIMIT 4 OFFSET 2; -- 3-6行
cpp 复制代码
//T2, 两个字符串最小ascll删除和, 20分, 40%
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @return int整型
     */
    int f[3030][3030];
    // int n, m; 
    // string ss1="", ss2="";
    // int ans = 1e9+10;
    // void dfs(string t1, string t2, int i, int j, int now){
    //     // cout<<i<<" "<<j<<" "<<ss1.size()<<" "<<ss2.size()-1<<"\n";
    //     if(i==ss1.size()-1 && j==ss2.size()-1){
    //         if(t1==t2){
    //             cout<<t1<<' '<<t2<<" "<<now<<"\n";
    //             ans = min(ans, now);
    //         }
    //         return ;
    //     }
    //     dfs(t1, t2+ss2[j], i+1, j+1, now+ss1[i]);
    //     dfs(t1+ss1[i], t2, i+1,j+1, now+ss2[j]);
    //     dfs(t1+ss1[i], t2+ss2[j], i+1,j+1,now+ss1[i]+ss2[j]);
    // }
    int minDeleteSum(string s1, string s2) {
        // ss1 = s1;
        // ss2 = s2;
        // dfs("", "", 0, 0, 0);
        // return ans;
        // write code here
        int n = s1.size(), m = s2.size();
        memset(f,0x3f,sizeof(f));
        // for(int i = 0; i < n; i++)f[i][0] = f[i-1][0]+s1[i];
        // for(int j = 0; j < m; j++)f[0][j] = f[0][j-1]+s2[j];
        for(int i = 0; i <= n; i++){
            for(int j = 0; j <= m; j++){
                if(s1[i]==s2[j]){
                    f[i][j] = min(f[i][j], f[i-1][j-1]);
                }else if(s1[i]==s2[j+1]){
                    f[i][j] = min(f[i][j], f[i-1][j-1]+s2[j]);
                    // f[i][j] = min(f[i][j], f[i][j]);
                }else if(s1[i+1]==s2[j]){
                    f[i][j] = min(f[i][j],  f[i-1][j-1]+s1[i]);
                    // f[i][j] = min(f[i][j], f[i][j]+s2[j]);
                }else{
                    f[i][j] = min(f[i][j], f[i-1][j-1]+s1[i]+s2[j]);
                }
            }
        }
        // cout<<f[n][m]<<"\n";
        return f[n-1][m-1];
    }
};

//T2-AC
//力扣原题: 712. 两个字符串的最小ASCII删除和
class Solution {
    public int minimumDeleteSum(String s1, String s2) {
        int m = s1.length(), n = s2.length();
        // dp[i][j] 表示使字符串 s1[0, i) 和字符串 s2[0, j) 相同最小的删除和
        int[][] dp = new int[m + 1][n + 1];
        // 当其中一个字符串为空时,使两个字符串相同就必须删除所有的字符
        for (int i = 0; i < m; i++) dp[i + 1][0] = dp[i][0] + s1.charAt(i);
        for (int j = 0; j < n; j++) dp[0][j + 1] = dp[0][j] + s2.charAt(j);
        for (int i = 0; i < m; i++) {
            int code1 = s1.charAt(i);
            for (int j = 0; j < n; j++) {
                int code2 = s2.charAt(j);
                dp[i + 1][j + 1] = Math.min(dp[i + 1][j] + code2, dp[i][j + 1] + code1);
                if (code1 == code2) {
                    dp[i + 1][j + 1] = dp[i][j];
                }
            }
        }

        return dp[m][n];
    }
}
cpp 复制代码
//T3 树的最长同值路径, 20分

//T3-AC
//力扣原题: 687. 最长同值路径

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int ans = 0;
    int dfs(TreeNode* u, int ff){
        int l=0, r=0;
        if(u->left != nullptr){
            l = dfs(u->left, u->val);
        }
        if(u->right != nullptr){
            r = dfs(u->right, u->val);
        }
        ans = max(ans, l+r+1);
        if(u->val == ff)return max(l, r)+1;
        return 0;
    }
    int longestUnivaluePath(TreeNode* root) {
        // write code here
        dfs(root, root->val);
        return ans-1;
    }
};

4、小米1

单选:15x3=45(408,DS+CN+OS,总体比较简单)

多选:10x3=30

代码:10+15=25

用时:30/90mins

后端开发,题面忘记了,已经好久了,T2没AC,具体也不确定是哪一把,不过好像是这个

cpp 复制代码
//T1-AC
#include<bits/stdc++.h>
using namespace std;
int main(){
    int x;  cin>>x;
    string s;  cin>>s;
    s = s+",";
    int mi = 1e9+10;
    int t = 0, a = 0;
    double res = 0 ,cc = 1;
    for(int i = 0; i < s.size(); i++){
        if(isdigit(s[i])){
            t = t*10+s[i]-'0';
        }else{
            if(s[i]==':'){
                a = t;
                // cout<<a<<" "<<t<<"\n";
            }else if(s[i]==','){
                // cout<<a<<" "<<t<<"\n";
                // cout<<"adsfa\n";
                // cout<<abs(x-a)<<" "<<mi<<"\n";
                if(abs(x-a)<mi){
                    mi = abs(x-a);
                    res = t;
                    // cout<<res<<'\n';
                }else if(abs(x-a)==mi){
                    res += t;
                    cc++;
                }
            }
            t = 0;
        }
    }
    printf("%.1lf\n", res/cc);
    return 0;
}
cpp 复制代码
//T2-87%,二十多分钟写完整张卷子,加上代码也没几分,就懒得调了,应该是贪心漏了特殊条件的判断
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
    int cost, less;
}aa[200100];
int n;
bool cmp(node x, node y){
    if(x.less != y.less)return x.less<y.less;
    return x.cost>y.cost;
}
signed main(){
    string s;  cin>>s;
    s = s+",";
    int t = 0, a = 0;
    int sum = 0;
    for(int i = 0; i < s.size(); i++){
        if(isdigit(s[i])){
            t = t*10+s[i]-'0';
        }else{
            if(s[i]==':'){
                a = t;
            }else if(s[i]==','){
                // cout<<a<<" "<<t<<"\n";
                aa[++n].cost = a;
                aa[n].less = t;
                sum += aa[n].cost;
            }
            t = 0;
        }
    }
    sort(aa+1,aa+n+1,cmp);
    // for(int i = 1; i<= n; i++){
    //     cout<<aa[i].cost<<" "<<aa[i].less<<'\n';
    // }
    // printf("%d\n", aa[n].less);
    int res = 1e18+10;
    for(int i = 1; i <= n; i++){
        if(sum-aa[i].cost+aa[i].less < res){
            res = sum-aa[i].cost+aa[i].less;
        }
    }
    cout<< res<<"\n";
    return 0;
}

5、小米2

小米测开, 2023-09-23

时间90分钟,实际用时30分钟,选择题估计能对一半多点?

单选题:10个,2分。OS(含linux命令)+DS(含C/py/Java代码和语法题)+CN(八股题)

多选题:10个,3分。以及测试相关的内容。

代码题:20+30=50分。

cpp 复制代码
//代码题:50分(20+30)。小米一如既往的C++用户不友好,这种输入还不如核心代码模式。
//T1 联通快判断, 20/20分
//[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]] => 3
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
string a[maxn];
int r = 0, c = 0;
int vis[maxn][maxn];
int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};
void dfs(int x, int y){
    vis[x][y] = 1;
    for(int i = 0; i < 4; i++){
        int nx = x+dx[i], ny = y+dy[i];
        if(nx>=0 && nx<r && ny >=0 && ny < c && a[nx][ny]=='1' && !vis[nx][ny]){
            dfs(nx, ny);
        }
    }
}
int main(){
    string s;  cin>>s;
    for(int i =0; i < s.size(); i++){
        if(s[i]==']')r++;
        else if(s[i]=='[' || s[i]==',')continue;
        else{
            a[r] = a[r]+s[i];
            c++;
        }
    }
    int res = 0;
    for(int i = 0; i < r; i++){
        // cout<<a[i]<<"\n";
        for(int j = 0; j < c; j++){
            if(!vis[i][j] && a[i][j] == '1'){
                dfs(i,j);
                res++;
            }
        }
    }
    cout<<res<<"\n";
    return 0;
}
cpp 复制代码
//T2,字符串操作, 30/30分
//找出所有相邻且相同的字母删掉。暴力试试。
#include<bits/stdc++.h>
using namespace std;
string calc(string s){
    string t = "";
    char lst = s[0]; int c = 1;
    for(int i = 1; i < s.size(); i++){
        if(s[i]==lst){
            c++;
        }else{
            if(c%2==1){
                t = t+lst;
            }
            lst = s[i];
            c = 1;
        }
    }
    if(c%2==1){
        t = t+lst;
    }
    return t;
}
int main(){
    string s;  cin>>s;
    string t = calc(s);
    for(int i = 0; i < 500; i++){
        if(t.size()>1)t = calc(t);
        else break;
    }
    cout<<t<<"\n";
    return 0;
}

6、网易雷火

2309,网易雷火游戏客户端

感觉秋招做下来最难搞(或者说最烦)的笔试了

不愧是3小时,感觉都是大模拟,dp,搜索

其实一定要说,好好做三个小时,大部分应该是能基本骗到的,但是AK感觉不太可能(纯看运气)

最后一个半小时后实在是懒得写了,题目又臭又长,卡精度什么的还。

题目参考

T1:给两个球队名,然后是 n 行,每行 3 个数据,分别是球员名, 球员所属的球队,球员的得分,要求输出获胜队伍(可能平局),MVP球员(如有多个,输出先拿到最高分的)。(15分)

cpp 复制代码
//T1, 全明星街球派对,15分,100%
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n;  cin>>n;
    string a, b;  cin>>a>>b;
    int va = 0, vb = 0;
    string mx; int mxv = 0;
    map<string,int>mp;
    for(int i = 1; i <= n; i++){
        string x, be; int y;  cin>>x>>be>>y;
        if(be==a){
            va += y;
        }else{
            vb += y;
        }
        mp[x] += y;
        if(mp[x] > mxv){
            mxv = mp[x];
            mx = x;
        }
    }
    if(va==vb)cout<<"ended in a draw\n";
    else if(va > vb)cout<<a<<"\n";
    else cout<<b<<"\n";
    cout<<mx<<"\n";
    return 0;
}

T2: n 个玩家,m 个阵营,k 个草地(圆形或矩形),玩家可通过站在草地内隐身或拥有拥有隐身buff隐身,相交的草地内的玩家可互相看见,在草地外的玩家不能看见的草地内不同阵营的玩家但可以看见同阵营的玩家,拥有隐身buff的玩家谁都看不见,输入玩家的信息(所在坐标,所属阵营,是否有隐身buff),输入草地信息(圆形给出圆心,半径【还有一个圆形的信息题目没认真看,不知道】,矩形给出四个顶点),问那些玩家能互相看见(大概是这个意思)。(25分)

cpp 复制代码
//T2, 生死场,精度不对,25分,13%
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2020;
double ax[maxn], ay[maxn];
int abuff[maxn], abe[maxn];
set<int>buff;
set<int>cao[maxn];
double tx[10], ty[10];
const double eps = 1e-9;
int main() {
    int n, m, q;  cin>>n>>m>>q;
    for(int i = 1; i <= n; i++){
        cin>>ax[i]>>ay[i]>>abuff[i]>>abe[i];
        if(abuff[i]==1)buff.insert(i);
    }
    for(int i = 1; i <= m; i++){
        int op;  cin>>op;
        if(op==1){
            for(int j = 1; j <= 4; j++){
                cin>>tx[i]>>ty[i];
            }
            for(int j = 1; j <= n; j++){
                if((ax[j]>=tx[1]|| ax[j]-tx[1]>0 && ax[j]-tx[1]<eps) 
                && (ax[j]<=tx[3] || tx[3]-ax[j]>0 && tx[3]-ax[j]<eps)
                && (ay[j]>=ty[1] || ay[j]-ty[1]>0 && ay[j]-ty[1]<eps) 
                && (ay[j]<=ty[3] || ty[3]-ay[j]>0 && ty[3]-ay[j]<eps)
                ){
                    cao[i].insert(j);
                }
                // else if(ax[j]-tx[1]<eps && tx[3]-ax[j]<eps && ay[j]-ty[1]<eps && ty[3]-ay[j]<eps){
                //     cao[i].insert(j);
                // }
            }
        }else{
            double cx, cy, cr;
            cin>>cx>>cy>>cr;
            for(int j = 1; j <= n; j++){
                double dr = (ax[j]-cx)*(ax[j]-cx)+(ay[j]-cy)*(ay[j]-cy);
                if(dr <= cr*cr || (cr*cr-dr<eps && cr*cr-dr>=0)){
                    cao[i].insert(j);
                }
            }
        }
    }
    for(int i = 1; i <= q; i++){
        int q1, q2;  cin>>q1>>q2;
        if(buff.count(q2)){
            cout<<0<<"\n"; continue;
        }
        if(abe[q1] == abe[q2]){
            cout<<1<<"\n"; continue;
        }
        int tt = 0;
        for(int j = 1; j <= m; j++){
            if(cao[j].count(q1) && cao[j].count(q2)){
                tt = 1;
                break;
            }
        }
        if(tt==1)cout<<1<<"\n";
        else cout<<0<<"\n";
    }
    for(int i = 1; i <= m; i++){
        for(int x : cao[i]){
            cout<<x<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

T3:给出 n 个草药,每个草药有它的价值v,属性a(阴0或阳1),对应的属性值,现在要炼丹,给出目标丹药的属性和属性值,炼丹过程相异属性会抵消,直到其中一个属性为0,炼丹所需草药不能超过 k 个,求练得目标丹药的所需草药的最小价值。(30分)

cpp 复制代码
//T3, 炼丹,30分,输出not有3%。
//写了个01背包,具体忘了多少,反正没拿满,代码粘漏了,补题是不可能补题的。

T4:给出 M * N 的二维数组,数组元素为'a' ~ 'z',每次可移动一次,可以往上下左右四个方向移动,也可以直接瞬移到与当前坐标的字符相同的某个坐标,给出 q 个查询,每个查询给出起点坐标,终点坐标,求从起点到终点的最短距离。(30分)

cpp 复制代码
//T4,小师妹传送门,30分,可以dfs/bfs暴力骗分
// 当时懒得写了,不过据说看别人也只骗了1%。
相关推荐
一直学习永不止步1 分钟前
LeetCode题练习与总结:迷你语法分析器--385
java·数据结构·算法·leetcode·字符串··深度优先搜索
Dragonlongbo8 分钟前
leetcode01 --- 环形链表判定
算法·leetcode·职场和发展
-cc- Lynn9 分钟前
链表类算法【leetcode】
算法·leetcode·链表
顾京31 分钟前
基于扩散模型的表单插补
人工智能·深度学习·算法
小冉在学习35 分钟前
day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
java·算法·图论
学无止境\n35 分钟前
[c语言]strcat函数的使用和模拟实现
c语言·开发语言·算法
五味香1 小时前
Linux命令学习,git命令
linux·c语言·开发语言·c++·git·学习·算法
邂逅you1 小时前
深度优先搜索之全排列问题(C语言版)
c语言·数据结构·学习·算法·贪心算法·深度优先
努力学算法的蒟蒻1 小时前
牛客小白月赛104 —— C.小红打怪
c++·算法
皮卡兽1 小时前
嵌入式课程day07-C语言流程控制语句作业
c语言·数据结构·算法