美团点评2020校招系统开发方向笔试题(编程题题解)

这套笔试题的编程题很简单,感觉没什么可以写的题解的


[编程题]大数加法

注意下负号的情况

#include 
using namespace std;
typedef long long ll;
const int maxn=1000050;
char a[150],b[150],ans[150];
int main()
{
    scanf("%s%s",a+1,b+1);
    int l1=strlen(a+1);
    int l2=strlen(b+1);
    int x=0,y=0;
    if(a[2]=='-'){
        for(int i=3;i

[编程题]回文子串

马拉车跑一遍就行

#include 
using namespace std;
typedef long long ll;
const int maxn=10050;
char Ma[maxn*2];
int Mp[maxn*2];
int Manacher(char s[],int len)
{
    int l = 0;
    Ma[l++] = '$';
    Ma[l++] = '#';
    for(int i = 0; ii ? min(Mp[2*id-i],mx-i) : 1;
        while(i-Mp[i]>=0 && Ma[i+Mp[i]]==Ma[i-Mp[i]]) Mp[i]++;
        if(i+Mp[i]>mx)
        {
            mx=i+Mp[i];
            id=i;
        }
    }
    return l;
}
 
char s[maxn];
 
int main()
{
    scanf("%s",s);
    int slen = strlen(s);
    int len = Manacher(s,slen),old=0;
    int ans=0;
    for(int i = 2; i

[编程题]合并金币

石子归并模板题

#include 
using namespace std;
typedef long long ll;
const int maxn=50;
ll a[maxn],f[maxn][maxn],sum[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    memset(f,125,sizeof(f));
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),f[i][i]=0,sum[i]=sum[i-1]+a[i];
    for(int len=2;len<=n;len++){
        for(int i=1,j=i+len-1;j<=n;i++,j++){
            for(int k=i;k

[编程题]最小唯一前缀

数据范围很小,直接暴力

#include
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
using namespace std;
const double eps=1e-8;
typedef long long ll;
const int maxn = 150;
char s[maxn][maxn];
int len[maxn];
int vis[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",s[i]+1);
        len[i]=strlen(s[i]+1);
    }
    for(int i=1;i<=n;i++){
        int f=0;
        for(int l=1;l<=len[i];l++){
            for(int j=1;j<=n;j++){
                if(i==j) continue;
                vis[j]=0;
            }
            int flag=0;
            for(int j=1;j<=n;j++){
                if(i==j||vis[j]) continue;
                if(l>len[j]){
                    vis[j]=1;
                    continue;
                }
                if(s[j][l]==s[i][l]){
                    flag=1;
                }
                else vis[j]=1;
            }
            if(!flag){
                f=1;
                for(int j=1;j<=l;j++) printf("%c",s[i][j]);
                printf("\n");
                break;
            }
        }
        if(!f) printf("%s\n",s[i]+1);
    }
}

 

你可能感兴趣的:(字符串,校招)