noi题库 1.7 字符串

前九题

01:统计数字字符个数

总时间限制

1000ms

 

内存限制

65536kB

描述

输入一行字符,统计出其中数字字符的个数。

输入

一行字符串,总长度不超过255。

输出

输出为1行,输出字符串里面数字字符的个数。

样例输入

Peking University is set up at 1898.

样例输出

4

来源

习题(7-1) 医学部 2010 期末试题 樊波

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

#include<algorithm>using namespace std;char a[10000];int main()

{

    int sum=0;

    gets(a);

    int l=strlen(a);

    for(int i=0;i<l;i++)

    {

        if(a[i]>='0'&&a[i]<='9')

        sum++;

    }    

    printf("%d",sum);

    return 0;

}

 

02:找第一个只出现一次的字符

总时间限制

1000ms

 

内存限制

65536kB

描述

给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。

输入

一个字符串,长度小于100000。

输出

输出第一个仅出现一次的字符,若没有则输出no。

样例输入

abcabd

样例输出

c

#include<iostream>

#include<cstdio>

#include<cstring>using namespace std;char a[100001],b[300];int c[25];int main()

{

    gets(a);

    int l=strlen(a);

    for(int i=0;i<l;i++)

       b[a[i]]++;

    for(int i=0;i<l;i++)

           if(b[a[i]]==1)

         {

           printf("%c",a[i]);

           return 0;

         }

    printf("no");

    return 0;

}

 

03:基因相关性

总时间限制

1000ms

 

内存限制

65536kB

描述

为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。

现比对两条长度相同的DNA序列。首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。

输入

有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。

输出

若两条DNA序列相关,则输出“yes”,否则输出“no”。

样例输入

0.85

ATCGCCGTAAGTAACGGTTTTAAATAGGCC

ATCGCCGGAAGTAACGGTCTTAAATAGGCC

样例输出

yes

#include<cstdio>

#include<string>

#include<iostream>using namespace std;int main()

{

    double a;

    scanf("%lf",&a);

    int i,p=0,len;

    double m;

    string s1,s2;

    cin>>s1;

    cin>>s2;

    int l1=s1.length(),l2=s2.length();

    if(l1>12) len=l1;

    else len=l2;

    for(i=0; i<len; i++)

    {

        if(s1[i]==s2[i])

        {

            p++;

        }

    }

    m=1.0*p/len;

    if(m>=a) cout<<"yes"<<endl;

    else cout<<"no"<<endl;

    return 0;

}

 

04:石头剪子布

总时间限制

1000ms

 

内存限制

65536kB

描述

石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。 

游戏规则:石头打剪刀,布包石头,剪刀剪布。 

现在,需要你写一个程序来判断石头剪子布游戏的结果。

输入

输入包括N+1行:
第一行是一个整数N,表示一共进行了N次游戏。1 <= N <= 100。
接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):
S1 S2
字符串之间以空格隔开S1,S2只可能取值在{"Rock", "Scissors", "Paper"}(大小写敏感)中。

输出

输出包括N行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。

样例输入

3

Rock Scissors

Paper Paper

Rock Paper

样例输出

Player1

Tie

Player2

提示

Rock是石头,Scissors是剪刀,Paper是布。混混谔谔

#include<cstdio>

#include<string>

#include<iostream>using namespace std;int main()

{

    int n;

    cin>>n;

    char a[500],b[500];

    for(int i=0;i<n;i++)

     {           

         cin>>a>>b;

         if(a[0]=='R'&&b[0]=='S'||a[0]=='S'&&b[0]=='P'||a[0]=='P'&&b[0]=='R') cout<<"Player1"<<endl;

         else 

              if(a[0]==b[0]) cout<<"Tie"<<endl;

              else cout<<"Player2"<<endl;

      }    

    return 0;

}

#include<stdio.h>

#include<string.h>

char a[500],b[500];

int main()

{

int x,y,n;

scanf("%d",&n);

for(int i=0;i<n;i++)

{

scanf("%s %s",a,b);

if(a[0]=='R' && b[0]=='S') printf("Player1\n");

if(a[0]=='S' && b[0]=='P') printf("Player1\n");

if(a[0]=='P' && b[0]=='R') printf("Player1\n");

if(b[0]=='R' && a[0]=='S') printf("Player2\n");

if(b[0]=='S' && a[0]=='P') printf("Player2\n");

if(b[0]=='P' && a[0]=='R') printf("Player2\n");

if(a[0]==b[0]) printf("Tie\n");

}

return 0;

}

 

 

哈希

哈希例题1

枚举循环节长度L

用哈希判断A[1L],A[L+12L],A[2L+13L]……是否相等

最后一个循环节长度可能不足L,特殊判断

代码实现

//哈希例题1
#include <cstdio>
#include <cstring>
#define e 29LL
#define mo 1000000007
#define N 100010
//定义常量
char s[N];
long long hash[N],hs,el;
int n,i,L;
bool flg;
int main() {
    scanf("%s", s+1);//下标是0到n-1;
    n = strlen(s+1);
    for (i=1; i<=n; ++i) {
        hash[i] = (hash[i-1]*e+(s[i]-'a'+1))%mo;
    }
    el = 1;
    for (L=1; L<=n; ++L)
    {
        el = el*e%mo;
        flg = true;
        for (i=L+1; i<n/L*L+1; i+=L)
        {
            hs = (hash[i+L-1]-hash[i-1]*el%mo+mo)%mo;
            if (hs != hash[L])
            {
                flg = false;
                break;
            }
        }
        if (flg)
        {
            for (i=n/L*L+1; i<=n; ++i)
                if (s[i] != s[i-n/L*L])
                {
                    flg = false;
                    break;
                }
            if (flg)
            {
                printf("%d\n", L);
                break;
            }
        }
    }
}

 

哈希例题2

O(n)时间内,计算出一个字符串以每个位置为中心(一个字符或者字符间隙)最长能扩展出多长的回文串

代码实现

//哈希例题2
#include <cstdio>
#include <cstring>
#define N 100011
#define e 29
#define mo 1000000007
char s[N];
long long hs1[N],hs2[N],a[N],HS1,HS2,pow[N];
int i,n,m,l,r,mid;
int main()
{
    scanf("%s", s+1);
    n = strlen(s+1);
    for (i=1; i<=n; ++i)
    {
        a[++m] = 27;
        a[++m] = s[i]-96;
    }
    a[++m] = 27;
    for (i=1; i<=m; ++i)
        hs1[i] = (hs1[i-1]*e+a[i])%mo;
    for (i=m; i>=1; --i)
        hs2[i] = (hs2[i+1]*e+a[i])%mo;
    pow[0] = 1;
    for (i=1; i<=m; ++i)
        pow[i] = pow[i-1]*e%mo;

    for (i=1; i<=m; ++i)
    {
        l = 0;
        if (i-1 < m-i) r = i-1+1;
        else r = m-i+1;
        while (r-l > 1)
        {
            mid = (l+r)/2;
            HS1 = (hs1[i-1]-hs1[i-mid-1]*pow[mid]%mo+mo)%mo;
            HS2 = (hs2[i+1]-hs2[i+mid+1]*pow[mid]%mo+mo)%mo;
            if (HS1 == HS2) l = mid;
            else r = mid;
        }
        printf("%d\n", l);
    }
}

 

05:输出亲朋字符串

编写程序,求给定字符串s的亲朋字符串s1。 

亲朋字符串s1定义如下:给定字符串s的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符; 给定字符串s的第二个字符的ASCII值加第三个字符的ASCII值,得到第二个亲朋字符;依此类推,直到给定字符串s的倒数第二个字符。亲朋字符串的最 后一个字符由给定字符串s的最后一个字符ASCII值加s的第一个字符的ASCII值。

 输入

输入一行,一个长度大于等于2,小于等于100的字符串。字符串中每个字符的ASCII值不大于63。

输出

输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。

样例输入

1234

 

样例输出

cege

代码实现

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[111],b[111];
int main()
{
gets(a);
int n=strlen(a);
for(int i=0;i<n-1;i++)
   {
       b[i]=a[i]+a[i+1];
       printf("%c",b[i]);
       //printf("%c",a[i]+a[i+1]);
   }
     b[n-1]=a[n-1]+a[0];
 printf("%c",b[n-1]);  
 //printf("%c",a[n-1]+a[0]);
return 0;
}
/*#include<cstdio>
#include<cstring>
char a[110];
int main()
{
int n1 ,i;
gets(a);
n1=strlen(a);
for(i = 0; i < n1-1;i++)
{
printf("%c",a[i]+a[i+1]);
}
printf("%c",a[n1-1]+a[0]);
return 0;
}*/

 

06:合法 C 标识符

描述

给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字)

C语言标识符要求:

1. 非保留字;

2. 只包含字母、数字及下划线(“_”)。

3. 不以数字开头。

输入

一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于20。

输出

一行,如果它是C语言的合法标识符,则输出yes,否则输出no。

样例输入

RKPEGX9R;TWyYcp

样例输出

no

代码实现

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

using namespace std;

int main()

{

char a[21];

cin>>a;

int n=strlen(a);

if(a[0]>='a'&&a[0]<='z'||a[0]>='A'&&a[0]<='Z'||a[0]=='_')

   {

     for(int i=1;i<n;i++)

     {

         if(a[i]<'0'||a[i]>'9'&&a[i]<'A'||a[i]>'Z'&&a[i]<'_'||a[i]>'_'&&a[i]<'a'||a[i]>'z')

            {

                cout<<"no";

                return 0;

}

 }

   }

else

{

cout<<"no";

return 0;

}

cout<<"yes";

return 0;

}

 

07:配对碱基

脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,腺瞟呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对。你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。

输入

一个字符串,表示一条碱基链。这个字符串只含有大写字母A、T、G、C,分别表示腺瞟呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。字符串长度不超过255。

输出

一个只含有大写字母A、T、G、C的字符串,为与输入的碱基链互补的碱基链。

样例输入

ATATGGATGGTGTTTGGCTCTG

样例输出

TATACCTACCACAAACCGAGAC

代码实现

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cstdlib>

#include<cmath>

using namespace std;

char a[260];

int main()

{

    gets(a);

    int n=strlen(a);

    for(int i=0;i<n;i++)

    {

        if(a[i]=='G')  printf("C");

        if(a[i]=='C')  printf("G");

        if(a[i]=='A')  printf("T");

        if(a[i]=='T')  printf("A");

}

return 0;

}

 

08:字符替换

描述

把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。

输入

只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。字符串是待替换的字符串,字符串长度小于等于30个字符,且不含空格等空白符;
接下来一个字符为需要被替换的特定字符;
接下来一个字符为用于替换的给定字符。

输出

一行,即替换后的字符串。

样例输入

hello-how-are-you o O

样例输出

hellO-hOw-are-yOu

代码实现

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

using namespace std;

char a[35],x,y;

int main()

{

cin>>a;

cin>>x>>y;

int n=strlen(a);

for(int i=0;i<n;i++)

{

if(a[i]==x)

 a[i]=y;

}

puts(a);

return 0;

 }

 

09:密码翻译

描述

在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。

输入

输入一行,包含一个字符串,长度小于80个字符。

输出

输出每行字符串的加密字符串。

样例输入

Hello! How are you!

样例输出

Ifmmp! Ipx bsf zpv!

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[85],x,y;
int main()
{
    gets(a);
    int n=strlen(a);
    for(int i=0;i<n;i++)
    {
        if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z')
        {
        if(a[i]=='z') a[i]='a';
        else 
           {
            if(a[i]=='Z') a[i]='A';
            else a[i]=a[i]+1;
           } 
        }     
    }
    puts(a);
    return 0;
 } 

 

转载于:https://www.cnblogs.com/z360/p/6376084.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值