9.4美团笔试

AC1235,4题目看错了,以为是01矩阵求四边形,样例没看写了半天ac9%,尬住了

01思路

状态转移方程

a[i][0][0]=(a[i-1][0][1]+a[i-1][0][0])%mod;//表示当前aa状态只能由前面aa或者ab继承
a[i][0][1]=(a[i-1][1][1])%mod;//表示当前ab状态只能由前面bb继承
a[i][1][1]=(a[i-1][1][1]+a[i-1][1][0])%mod;//表示当前bb状态只能由前面ba或者bb继承
a[i][1][0]=(a[i-1][0][0])%mod;//表示当前ba状态只能由前面aa继承

02思路

建图,跑弗洛伊德,一开始91%,然后想到没跑到的可能输出0,然后还是91%,还好看了公告没跑到的-1

建图:先把每个线路能通过的点,放一块,表示这些点到点的距离是1

代码

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define mod 998244353
#define inf 0x3f3f3f3f
using namespace std;
const int N=500+10;
int ans[N][N];
int n,m;
vector<int>a[N];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int num;scanf("%d",&num);
        for(int j=0;j<num;j++){
            int u;scanf("%d",&u);
            a[u].push_back(i);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) ans[i][j]=0;
            else ans[i][j]=inf;//初始化
        }
    }
    for(int i=1;i<=m;i++){
        int x=a[i].size();
        for(int j=0;j<x;j++){
            for(int k=j+1;k<x;k++){
                ans[a[i][j]][a[i][k]]=1;
                ans[a[i][k]][a[i][j]]=1;//建图
            }
        }
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(ans[i][j]>ans[i][k]+ans[k][j]){
                    ans[i][j]=ans[i][k]+ans[k][j];//弗洛伊德
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
           if(ans[i][j]==inf){
            ans[i][j]=-1;//没走到的标记为-1
           }
        }
    }
     for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf(j==n?"%d\n":"%d ",ans[i][j]);
        }
    }
    return 0;
}

3思路

全场最简单题,核心代码

for(int i=n-1;i>=0;i--){
    if(s[i]=='c')num++;//num表示c的个数
    else sum+=num;//sum表示移动次数
}

04思路

最后十分钟没想好怎么去重,跑了一个dfs,求一个04思路(评论区两大牛,两个猛男思路)

05思路

前缀和+线段树求区间最小最大值

ac代码

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define mod 998244353
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+10;
ll trmin[N*4],trmax[N*4];
ll sum[N];
int n,m,id=0;
ll a[N];
void pushup(int x){
    trmin[x]=min(trmin[x<<1],trmin[x<<1|1]);
    trmax[x]=max(trmax[x<<1],trmax[x<<1|1]);
}
void build(int x,int l,int r){
    if(l==r){
        trmin[x]=a[l];
        trmax[x]=a[l];//cout<<a[l]<<endl;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
ll querymx(int x,int l,int r,int l1,int r1){
    if(l1<=l && r<=r1){
        return trmax[x];
    }
    int mid=(l+r)>>1;
    ll zhi=0;
    if(l1<=mid){
        zhi=max(zhi,querymx(x<<1,l,mid,l1,r1));
    }
    if(r1>mid){
        zhi=max(zhi,querymx(x<<1|1,mid+1,r,l1,r1));
    }
    return zhi;
}
ll querymi(int x,int l,int r,int l1,int r1){
    if(l1<=l && r<=r1){
        return trmin[x];
    }
    int mid=(l+r)>>1;
    ll zhi=10000000100;
    if(l1<=mid){
        zhi=min(zhi,querymi(x<<1,l,mid,l1,r1));
    }
    if(r1>mid){
        zhi=min(zhi,querymi(x<<1|1,mid+1,r,l1,r1));
    }
    return zhi;
}
int main(){
    sum[0]=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];
    }
    build(1,1,n);
    ll sumx=0;
    for(int i=1;i<=n-m+1;i++){
        ll mi=querymi(1,1,n,i,i+m-1),mx=querymx(1,1,n,i,i+m-1);
        ll xx=sum[i+m-1]-sum[i-1]-mi-mx;
        if(xx>sumx) id=i,sumx=xx;
    }
    printf("%d\n",id);
    return 0;
}
/*
10 3
14 24 14 22 44 29 33 45 36 48
*/
#美团##C/C++#
全部评论
第四题,枚举累计以i,j节点为对角节点的四边形个数(相同邻居节点个数为m,则以i,j节点为对角节点的四边形个数为组合数Cm2),因为一个四边形有两个对角,所以会重复计算一次。
1 回复 分享
发布于 2021-09-04 18:41
第四题,输入的那个矩阵开四次方,每个点ai,j就代表i点走四步可以到达j的路线数,所以统计i从1到n所有a(i,i)的和(四边形就是从一个点走四步回到原点),但是走四步回原点还有可能是两个点来回走和三个点来回走,所以要减去,用原矩阵开二次方,遍历所有点,如果i=j,就减去a(i,j)的平方,否则减去a(i,j)
1 回复 分享
发布于 2021-09-04 18:37
第5题是滑动窗口最大最小值,单调队列
1 回复 分享
发布于 2021-09-04 18:25
请问你是后台还是算法岗 笔试只有编程题吗
点赞 回复 分享
发布于 2021-09-24 22:35
这第三题的解法妙啊
点赞 回复 分享
发布于 2021-09-04 19:03
大佬别卷了😂
点赞 回复 分享
发布于 2021-09-04 18:19
其他都不会,哭了
点赞 回复 分享
发布于 2021-09-04 18:16
第一题全场最简单,就是个斐波那契
点赞 回复 分享
发布于 2021-09-04 18:16

相关推荐

03-21 17:21
算法工程师
挑战:用户增长分析中的虚假注册识别问题背景:-&nbsp;负责分析电商平台的新用户增长数据-&nbsp;发现某些时段用户注册量异常激增-&nbsp;怀疑存在批量虚假注册影响数据真实性-&nbsp;需要建立有效的识别方法解决方案:1.&nbsp;数据探索:```sql--&nbsp;初步分析注册数据分布SELECT &nbsp;&nbsp;&nbsp;&nbsp;DATE(register_time)&nbsp;as&nbsp;reg_date,&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*)&nbsp;as&nbsp;user_cnt,&nbsp;&nbsp;&nbsp;&nbsp;COUNT(DISTINCT&nbsp;ip_address)&nbsp;as&nbsp;ip_cnt,&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*)/COUNT(DISTINCT&nbsp;ip_address)&nbsp;as&nbsp;user_per_ipFROM&nbsp;user_registerGROUP&nbsp;BY&nbsp;DATE(register_time)ORDER&nbsp;BY&nbsp;reg_date;--&nbsp;检查设备特征SELECT &nbsp;&nbsp;&nbsp;&nbsp;device_type,&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*)&nbsp;as&nbsp;cnt,&nbsp;&nbsp;&nbsp;&nbsp;COUNT(DISTINCT&nbsp;user_id)&nbsp;as&nbsp;user_cntFROM&nbsp;user_registerGROUP&nbsp;BY&nbsp;device_typeORDER&nbsp;BY&nbsp;cnt&nbsp;DESC;```2.&nbsp;制定识别标准:建立用户可疑度评分机制```pythondef&nbsp;calculate_risk_score(user_data):&nbsp;&nbsp;&nbsp;&nbsp;score&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;1.&nbsp;时间维度&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;user_data[&#39;register_interval&#39;]&nbsp;&lt;&nbsp;30:&nbsp;&nbsp;#&nbsp;注册间隔太短&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score&nbsp;+=&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;2.&nbsp;IP维度&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;user_data[&#39;ip_user_count&#39;]&nbsp;&gt;&nbsp;10:&nbsp;&nbsp;#&nbsp;同IP注册过多&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score&nbsp;+=&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;3.&nbsp;设备维度&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;user_data[&#39;device_id&#39;]&nbsp;==&nbsp;&#39;&#39;:&nbsp;&nbsp;#&nbsp;设备标识缺失&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score&nbsp;+=&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;4.&nbsp;行为维度&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;user_data[&#39;first_action_time&#39;]&nbsp;-&nbsp;user_data[&#39;register_time&#39;]&nbsp;&lt;&nbsp;60:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score&nbsp;+=&nbsp;1&nbsp;&nbsp;#&nbsp;注册后行为过快&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;score```3.&nbsp;特征工程:```pythonimport&nbsp;pandas&nbsp;as&nbsp;pddef&nbsp;create_features(df):&nbsp;&nbsp;&nbsp;&nbsp;features&nbsp;=&nbsp;pd.DataFrame()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;时间特征&nbsp;&nbsp;&nbsp;&nbsp;features[&#39;hour&#39;]&nbsp;=&nbsp;df[&#39;register_time&#39;].dt.hour&nbsp;&nbsp;&nbsp;&nbsp;features[&#39;weekday&#39;]&nbsp;=&nbsp;df[&#39;register_time&#39;].dt.weekday&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;IP特征&nbsp;&nbsp;&nbsp;&nbsp;ip_stats&nbsp;=&nbsp;df.groupby(&#39;ip_address&#39;).agg({&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;user_id&#39;:&nbsp;&#39;count&#39;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;device_id&#39;:&nbsp;&#39;nunique&#39;&nbsp;&nbsp;&nbsp;&nbsp;}).reset_index()&nbsp;&nbsp;&nbsp;&nbsp;features&nbsp;=&nbsp;features.merge(ip_stats,&nbsp;on=&#39;ip_address&#39;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;设备特征&nbsp;&nbsp;&nbsp;&nbsp;features[&#39;device_type_encoded&#39;]&nbsp;=&nbsp;pd.factorize(df[&#39;device_type&#39;])[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;行为特征&nbsp;&nbsp;&nbsp;&nbsp;features[&#39;action_delay&#39;]&nbsp;=&nbsp;(df[&#39;first_action_time&#39;]&nbsp;-&nbsp;df[&#39;register_time&#39;]).dt.total_seconds()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;features```4.&nbsp;建立监控机制:```pythondef&nbsp;monitor_registration_anomaly(data):&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;计算历史基线&nbsp;&nbsp;&nbsp;&nbsp;historical_mean&nbsp;=&nbsp;data[&#39;daily_registrations&#39;].rolling(window=30).mean()&nbsp;&nbsp;&nbsp;&nbsp;historical_std&nbsp;=&nbsp;data[&#39;daily_registrations&#39;].rolling(window=30).std()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;设置告警阈值&nbsp;&nbsp;&nbsp;&nbsp;threshold&nbsp;=&nbsp;historical_mean&nbsp;+&nbsp;2&nbsp;*&nbsp;historical_std&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检测异常&nbsp;&nbsp;&nbsp;&nbsp;anomalies&nbsp;=&nbsp;data[data[&#39;daily_registrations&#39;]&nbsp;&gt;&nbsp;threshold]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;anomalies```5.&nbsp;可视化分析:```pythonimport&nbsp;seaborn&nbsp;as&nbsp;snsimport&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt#&nbsp;时间分布可视化plt.figure(figsize=(12,&nbsp;6))sns.histplot(data=df,&nbsp;x=&#39;register_hour&#39;,&nbsp;bins=24)plt.title(&#39;Registration&nbsp;Distribution&nbsp;by&nbsp;Hour&#39;)#&nbsp;IP地址分布plt.figure(figsize=(10,&nbsp;6))sns.boxplot(data=df,&nbsp;x=&#39;ip_user_count&#39;)plt.title(&#39;Users&nbsp;per&nbsp;IP&nbsp;Distribution&#39;)#&nbsp;风险评分分布plt.figure(figsize=(10,&nbsp;6))sns.kdeplot(data=df,&nbsp;x=&#39;risk_score&#39;)plt.title(&#39;Risk&nbsp;Score&nbsp;Distribution&#39;)```效果:1.&nbsp;识别出约15%的可疑注册用户2.&nbsp;真实用户增长曲线更准确3.&nbsp;建立了实时监控机制学到的经验:1.&nbsp;数据分析需要多维度思考2.&nbsp;重视数据可视化的作用3.&nbsp;需要平衡准确性和实用性4.&nbsp;持续迭代优化很重要后续改进:1.&nbsp;引入机器学习模型提高准确率2.&nbsp;增加更多维度的特征3.&nbsp;建立自动化报告机制4.&nbsp;优化预警阈值设置补充说明一些实用的分析技巧:1.&nbsp;数据质量检查:```pythondef&nbsp;check_data_quality(df):&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检查缺失值&nbsp;&nbsp;&nbsp;&nbsp;missing_report&nbsp;=&nbsp;df.isnull().sum()&nbsp;/&nbsp;len(df)&nbsp;*&nbsp;100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检查异常值&nbsp;&nbsp;&nbsp;&nbsp;numeric_cols&nbsp;=&nbsp;df.select_dtypes(include=[&#39;float64&#39;,&nbsp;&#39;int64&#39;]).columns&nbsp;&nbsp;&nbsp;&nbsp;stats&nbsp;=&nbsp;df[numeric_cols].describe()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检查重复值&nbsp;&nbsp;&nbsp;&nbsp;duplicate_count&nbsp;=&nbsp;df.duplicated().sum()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;missing_rate&#39;:&nbsp;missing_report,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;stats&#39;:&nbsp;stats,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;duplicates&#39;:&nbsp;duplicate_count&nbsp;&nbsp;&nbsp;&nbsp;}```2.&nbsp;用户行为分析:```python#&nbsp;用户行为路径分析def&nbsp;analyze_user_path(df):&nbsp;&nbsp;&nbsp;&nbsp;user_paths&nbsp;=&nbsp;df.groupby(&#39;user_id&#39;).agg({&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;action_type&#39;:&nbsp;lambda&nbsp;x:&nbsp;&#39;-&gt;&#39;.join(x),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;action_time&#39;:&nbsp;&#39;count&#39;&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;user_paths.value_counts().head(10)```#牛客AI配图神器#
点赞 评论 收藏
分享
评论
6
8
分享

创作者周榜

更多
牛客网
牛客企业服务