京东8.12AK C++卷

选择题+三道编程题,整体难度不高,8000hc,东子也可以冲了

第一题思路:上界为n/2,然后暴力就好了

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
string solve(string str,int num){
    if(num==0)return str;
    string str1=str.substr(0,num);
    string str2=str.substr(num,str.length()-num);
    string str3=str2+str1;
    return str3;
}
int judge(string str){
    int len=str.length();
    int num=0;
    for(int i=0;i<len;i++){
        if(str[i]!=str[len-i-1]){
            num++;
        }
    }
    return num/2;
}
int main(){
    string str;
    int n;
    cin>>n;
    cin>>str;
    int len=n/2;
    int ans=n/2;
    for(int i=0;i<=len;i++){
        string str_temp=solve(str,i);
        int num=judge(str_temp);
        ans=min(ans,num+i);
        // cout<<str_temp<<endl;
    }
    cout<<ans<<endl;
}

第二题思路:滚动数组的思想更新状态即可,卡点为当n为1,但输入大于9时,输出全为0

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <algorithm>
#include <stack>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll dp[10];
ll last[10];
stack<int>st;
int main(){
    memset(dp,0,sizeof(dp));
    memset(last,0,sizeof(last));
    int n;cin>>n;
    ll tar;
    for(int i=1;i<=n;i++){
        ll w;cin>>w;
        if(n==1)tar=w;
        w=w%10;
        st.push(w);
    }
    if(n==1){
        int val=tar;
        for(int i=0;i<10;i++){
            if(i==val){
                cout<<1<<' ';
            }else{
                cout<<0<<' ';
            }
        }
        cout<<endl;
    }
    else{
        int u=st.top();st.pop();
        int v=st.top();st.pop();
        int x=(u*v)%10;
        int y=(u+v)%10;
        dp[x]++;dp[y]++;
        for(int i=0;i<10;i++){
            last[i]=dp[i];
        }
        while(!st.empty()){
            memset(dp,0,sizeof(dp));
            int w=st.top();st.pop();
            for(int i=0;i<10;i++){
                if(last[i]!=0){
                    int xx=(i+w)%10;
                    int yy=(i*w)%10;
                    dp[xx]=(dp[xx]+last[i])%mod;
                    dp[yy]=(dp[yy]+last[i])%mod;
                }
            }
            for(int i=0;i<10;i++){
                last[i]=dp[i];
            }
        }
        for(int i=0;i<10;i++){
            cout<<last[i]<<' ';
        }cout<<endl;
    }
    
}

第三题思路:分开判断摆正的正方形和斜的正方形即可

#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 55;
int n,m;
string mapInfo[N];
ll allsum;
bool islegal(int x,int y){
    if(x<0||x>n||y<0||y>m||mapInfo[x][y]!='X')return false;
    else return true;
}
void judge(int x,int y){
    int xx,yy;
    xx=x;
    yy=y;
    for(int i=1;i<=max(m,n);i++){
        xx=x+i;
        yy=y+i;
        if(islegal(xx,yy)==false)continue;
        xx=x;
        yy=y+i;
        if(islegal(xx,yy)==false)continue;
        xx=x+i;
        yy=y;
        if(islegal(xx,yy)==false)continue;
        allsum++;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            xx=x;yy=y;
            if(i==0&&j==0)continue;
            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
            xx=xx+i;
            yy=yy+j;
            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
            if(islegal(xx,yy)==false)continue;
            xx=xx+j;
            yy=yy-i;
            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
            if(islegal(xx,yy)==false)continue;
            xx=xx-i;
            yy=yy-j;
            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
            // cout<<"==========="<<endl;
            if(islegal(xx,yy)==false)continue;
            xx=xx-j;
            yy=yy+i;
            if(islegal(xx,yy)==false)continue;
            allsum++;
            // cout<<x<<' '<<y<<' '<<i<<' '<<j<<endl;
        }
    }
}
int main(){
    allsum=0;
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>mapInfo[i];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mapInfo[i][j]=='X'){
                judge(i,j);
            }
        }
    }
    // ll ans=allsum/4;
    cout<<allsum<<endl;
}
全部评论
一看就是acm
2 回复 分享
发布于 2023-08-12 21:31 广东
Acm选手,太强了
1 回复 分享
发布于 2023-08-12 21:53 上海
同学,阿里控股集团JAVA开发岗投吗?我们和其他业务集团独立招聘,可以多次机会。需要的话,可以联系我。
点赞 回复 分享
发布于 2023-08-14 19:40 浙江

相关推荐

02-24 14:20
已编辑
广州大学 产品经理
我自己是985本英专在读,从大二下学期开始接触AI,大四的时候秋招成功拿到了三家大厂的AI产品经理offer。相信大部分同学和我一样,在刚开始学习AI相关知识的时候,一直在犹豫是否要从代码开始,学c语言、学Python,陷入了似乎只有学计算机才能懂AI的困境。其实直到现在,不借助任何工具,我自己也不能成功写出超过10行代码,但我可以在几小时内利用各种AI工具vibe出一个软件产品出来。转行AI,不会写代码其实真没事,关键是你是否具备这些AI技能!工具应用层(最基础,必须会)能用AI工具完成实际任务,比如用VibeCoding工具(Cursor、ClaudeCode等)把产品idea跑通,用Gemini/Claude做信息拆解、文档撰写、竞品分析等。技术认知层(不用会做,但要听得懂)理解主流AI技术的原理和边界,比如大模型是怎么工作的、agent的底层逻辑是什么、RAG和fine-tuning的区别在哪。不需要手写代码,但要能和技术团队对话,判断一个需求技术上是否可行。产品能力层(核心竞争力)懂用户需求、会拆解产品逻辑、能写清晰的PRD,这些是传统PM能力,但在AI产品里需要叠加对AI能力边界的判断——知道哪些场景适合用AI解决,哪些不适合。行业认知层(持续积累)保持对AI行业动态的敏感度,了解主流模型、工具、竞品的最新进展。当然,在日常看到一些AI资讯的时候,少不了接触各种晦涩难懂的技术术语。我的方法就是碰到一个不懂的直接丢给gemini让他讲,直到自己看明白,一点点日积月累,就能慢慢掌握“技术”的理解。
掌握什么AI技能,会为你...
点赞 评论 收藏
分享
评论
14
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务