文章目录
这边的笔试都是带选择题的,编程题部分占比只有一半上下。
我这里主要只记录下算法题部分的,毕竟单选多选反正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日
单选: 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%。