1. 程式人生 > >招商銀行信用卡中心2018秋招部分程式設計題彙總

招商銀行信用卡中心2018秋招部分程式設計題彙總

1、給出一個非空的字串,判斷這個字串是否是由它的一個子串進行多次首尾拼接構成的。

例如,"abcabcabc"滿足條件,因為它是由"abc"首尾拼接而成的,而"abcab"則不滿足條件。

輸入描述:

非空字串

輸出描述:

如果字串滿足上述條件,則輸出最長的滿足條件的的子串;如果不滿足條件,則輸出false。

輸入例子1:

abcabc

輸出例子1:
abc
#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    int i,j,k;
    char s1[20],s2[20];
    bool flag1=false,flag2=false;
    cin>>s1;
    for(i=0,j=strlen(s1)/2;i<strlen(s1)/2;i++,j++)
    {
        if(s1[i]!=s1[j])
        {
            flag1=true;
            break;
        }
    }
    //cout<<"i,j,"<<i<<" "<<j<<endl;
    for(i=0,j=strlen(s1)/3,k=2*strlen(s1)/3;i<strlen(s1)/3;i+

+,j++,k++)
    {
        if(s1[i]!=s1[j] || s1[i]!=s1[k] || s1[j]!=s1[k])
        {
            flag2=true;
            break;
        }
    }
    //cout<<"i,j,k"<<i<<" "<<j<<" "<<k<<endl;
    if(flag1==true && flag2==true)
        cout<<"false"<<endl;
    else if(flag1==false && flag2==true)
    {
        cout<<strncpy(s2,s1,strlen(s1)/2);
    }
    else if(flag1==true && flag2==false)
    {
        cout<<strncpy(s2,s1,strlen(s1)/3);
    }
    else
    {
        cout<<s1[0];
    }
    return 0;
}

3、

給出一個整數n,將n分解為至少兩個整數之和,使得這些整數的乘積最大化,輸出能夠獲得的最大的乘積。

例如:

2=1+1,輸出1;

10=3+3+4,輸出36。

輸入描述:

輸入為1個整數

輸出描述:

輸出為1個整數

輸入例子1:

10

輸出例子1:

36
#include<iostream>
using namespace std;
int main()
{
    int n,i,j,maxs=0;;
    int res[100]={0};
    cin>>n;
    res[1]=0;
    for(i=2;i<=n;i++)
    {
        for(j=1;j<=i/2;j++)
        {
            maxs=max(maxs,max(j,res[j])*max(i-j,res[i-j]));
        }
        res[i]=maxs;
    }
    cout<<res[n];
    return 0;
}

4、

從非負整數序列 0, 1, 2, ..., n中給出包含其中n個數的子序列,請找出未出現在該子序列中的那個數。

輸入描述:

輸入為n+1個非負整數,用空格分開。
其中:首個數字為非負整數序列的最大值n,後面n個數字為子序列中包含的數字。

輸出描述:

輸出為1個數字,即未出現在子序列中的那個數。

輸入例子1:

3 3 0 1

輸出例子1:

2
#include<iostream>
using namespace std;
int main()
{
    int n,a[20],sum=0,sum1=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sum=sum+a[i];
    }
    for(int j=n;j>0;j--)
    {
        sum1=sum1+j;
    }
    cout<<sum1-sum;
    return 0;
}

5、小招喵喜歡在數軸上跑來跑去,假設它現在站在點n處,它只會3種走法,分別是:
1.數軸上向前走一步,即n=n+1 
2.數軸上向後走一步,即n=n-1 
3.數軸上使勁跳躍到當前點的兩倍,即n=2*n
現在小招喵在原點,即n=0,它想去點x處,快幫小招喵算算最快的走法需要多少步?
輸入描述:

小招喵想去的位置x

輸出描述:

小招喵最少需要的步數

輸入例子1:

3

輸出例子1:

3
#include<iostream>
using namespace std;
int main()
{
    int x;
    int res[10000]={0};
    cin>>x;
    res[0]=0;
    res[1]=1;
    for(int i=2;i<=abs(x)+1;i++)
    {
        res[i]=min(res[i-1]+1,i%2==0?(res[i/2]+1):res[i-1]+1);
        res[i-1]=min(res[i-1],res[i]+1);
    }
    cout<<res[abs(x)];
    return 0;
}