字符串处理(一)

第1题     统计字母

某次科研调查时得到了n个字母。现在需要统计这些字母各自出现的次数,并按照字母的ASCII码从小到大的顺序输出统计结果。

输入格式

输入数据共两行,第一行是整数n,表示字母的个数;(1<=n<=100000) 

第2行,为一个字符串,全部是大写字母。 

输出格式

输出包含m行(m为n个字母中不相同数的个数),按照字母ASCII码从小到大的顺序输出。每行输出两个值,分别是字母和该字母出现的次数,其间用一个空格隔开。

输入/输出例子1

输入:

8

ABCABZWZ

输出:

A 2

B 2

C 1

W 1

Z 2

#include<bits/stdc++.h>
using namespace std;
int n,a[1005];
char c;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c;
        a[int(c)]++;
    }
    for(int i=1;i<=90;i++){
        if(a[i]>=1)cout<<char(i)<<" "<<a[i]<<'\n';
    }
    return 0;
}

第2题     字符归类

输入一篇文章,归类统计大写字母,小写字母、数字字符,还有其他字符的个数。

输入格式

输入数据共n+1行,第1行 输入n

以下有n行,每行最多不超过200个字符,保证没有空格。

输出格式

输出数据共4行,

第1行大写字母个数;

第2行小写字母个数;

第3行数字字符的个数;

第4行其他字符的个数。

输入/输出例子1

输入:

2

23123ASJDFHAKJSaafd%^&$133

faskasdfjfaADFAKIE1231564()(

输出:

A-Z:17

a-z:15

0-9:15

qita:7

#include<bits/stdc++.h>
using namespace std;
int n,s1,s2,s3,s4;
string s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>s;
    	for(int j=0;j<s.size();j++){
    		if(s[j]>='A'&&s[j]<='Z')s1++;
    		else if(s[j]>='a'&&s[j]<='z')s2++;
    		else if(s[j]>='0'&&s[j]<='9')s3++;
    		else s4++;
    	}
    }
    cout<<"A-Z:"<<s1<<'\n';
    cout<<"a-z:"<<s2<<'\n';
    cout<<"0-9:"<<s3<<'\n';
    cout<<"qita:"<<s4;
    return 0;
}

第3题     手机

手机的键盘是这样的: 

2022-04-06_192505.jpg

如下图所示: 

20180102160041_58364.jpg

要按出英文字母就必须要按数字键多下。例如要按出x就得按9两下,第一下会出w,而第二下会把w变成x。0键按一下会出一个空格。 

你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。 

输入格式

一行一个句子,只包含英文小写字母和空格,且不超过200个字符。

输出格式

一行一个整数,表示按键盘的总次数。

输入/输出例子1

输入:

i have a dream 

输出:

23

#include<bits/stdc++.h>
using namespace std;
char c[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
string x;
int a[26]={0},s=0;
int main(){
	getline(cin,x);
	int n=x.size();
	for(int i=0;i<n;i++){
		if(x[i]==' '){
			s++;
			continue;
		}
		for(int j=0;j<26;j++){
			if(c[j]==x[i]){
				a[j]++;
				break;
			}
		}
	}
	s+=3*(a[2]+a[5]+a[8]+a[11]+a[14]+a[17]+a[21]+a[24])+4*(a[18]+a[25])+a[0]+a[3]+a[6]+a[9]+a[12]+a[15]+a[19]+a[22]+2*(a[1]+a[4]+a[7]+a[10]+a[13]+a[16]+a[20]+a[23]);
	cout<<s;
	return 0;
}

第4题     字符串合并

读入两个字符串S1,S2,长度不超过120,把这两个字符串合并成一个串S,规则如下:如果S1串长度大于S2串的长度,即S1串的第一个字符在前面,后跟S2串的第一个字符,如此重复到最后,反之,则把S2串的第一个字符放前面,后接S1串的第一个字符,一直得重复到结束。 

输入格式

输入为两行,分别为两个字符串,如:

abcd

12345 

输出格式

输出为一行,为合并后的字符串,如上例为:1a2b3c4d5 

输入/输出例子1

输入:

a

bcd

输出:

bacd 

输入/输出例子2

输入:

123456

abcd

输出:

1a2b3c4d56

#include<bits/stdc++.h>
using namespace std;
string s,s1;
int main(){
    cin>>s>>s1;
    if(s.size()>s1.size()){
        for(int i=0;i<s1.size();i++){
            cout<<s[i]<<s1[i];
        }
    	for(int i=s1.size();i<s.size();i++){
    		cout<<s[i];
    	}
    }
    else {
        for(int i=0;i<s.size();i++){
            cout<<s1[i]<<s[i];
        }
        for(int i=s.size();i<s1.size();i++){
    		cout<<s1[i];
    	}
    }
    return 0;
}

第5题     生日礼物 

聪明的 chnlkw 收到了很多礼物,但是作为 chnlkw 的经纪人萝卜,很想知道 chnlkw这次共收到了价值多少的礼物。Chnlkw 对每一件礼物都作了自动的登记。而经纪人通过网络查找到了它们的价值。现在请你帮他们计算一下礼物的总价值。 

输入格式

输入文件 gift.in 共 N+K+1 行。 

第一行为正整数 n,k 表示共收到了 n 件礼物,经纪人查到了 k 件物品的价值; 

接下来的 n 行,包含礼物的名称(名称不包含空格)和这件礼物件数,中间有且仅有一个空格; 

接下来的 k 行,包含了经纪人查到物品名称和价值,中间有且仅有一个空格;

输出格式

输出文件 gift.out 共1 行。只输出一个数字,表示礼物的总价值;如果无法确定礼物的总价值,则输出 Unknow 

输入/输出例子1

输入:

4 6 

Apple 1 

Pear 2 

Juice 4 

OkCard 5 

Apple 5

Pear 6 

OkCard 0 

Juice 2 

Car 100000 

Plane 1000000 

输出:

25 

样例解释

【数据范围】 

对于 30%的数据,n,k≤100 。 

对于 70%的数据,n,k≤1000。 

对于 100%的数据,n≤1000, k≤2000。 

所有输入数据保证小于 int的最大值。物品名称的长度≤10 。

#include<bits/stdc++.h>
using namespace std;
long long n,m,s,x;
struct str{
	string name;
	int js,jg;
}a[100005],b[100005];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].name>>a[i].js;
	}
	for(int i=1;i<=m;i++){
		cin>>b[i].name>>b[i].jg;
		for(int j=1;j<=n;j++){
			if(b[i].name==a[j].name)a[j].jg=b[i].jg,x++;
		}
	}
	for(int i=1;i<=n;i++){
         s+=(a[i].js*a[i].jg);
    }
	if(x>=n)cout<<s;
    else cout<<"Unknow";
	return 0;
}

第6题     5和6 

老师在黑板写了两个整数A和B,让奶牛Bessie做加法运算,Bessie比较笨,可能会数字5和6混淆,则既可能把5错看成了6,也可能把6错看成了5。问:Bessie可能得到的最小值和最大值分别是多少。 

输入格式

第一行,两个整数,A和B,1 <= A ,B <=1000000。

输出格式

一行,可能得到的最小值和最大值。

输入/输出例子1

输入:

11 25 

输出:

36 37 

输入/输出例子2

输入:

1430 4862 

输出:

6282 6292

输入/输出例子3

输入:

16796 58786 

输出:

74580 85582 

#include<bits/stdc++.h>
using namespace std;
long long a,b,c,d,e,f,s,s1,x[10005],y[10005];
int main(){
    cin>>a>>b;
    d=a,e=b;
    while(a){
    	c++;
    	x[c]=a%10;
    	if(x[c]==6)x[c]=5;
    	a/=10;
    }
    for(int i=c;i>=1;i--){
    	s=s*10+x[i];
    }
    while(b){
    	f++;
    	y[f]=b%10;
    	if(y[f]==6)y[f]=5;
    	b/=10;
    }
    for(int i=f;i>=1;i--){
    	s1=s1*10+y[i];
    }
    cout<<s+s1<<" ";
    s=0,s1=0,c=0,f=0;
    while(d){
    	c++;
    	x[c]=d%10;
    	if(x[c]==5)x[c]=6;
    	d/=10;
    }
    for(int i=c;i>=1;i--){
    	s=s*10+x[i];
    }
    while(e){
    	f++;
    	y[f]=e%10;
    	if(y[f]==5)y[f]=6;
    	e/=10;
    }
    for(int i=f;i>=1;i--){
    	s1=s1*10+y[i];
    }
    cout<<s+s1;
    return 0;
}

第7题     乐乐的图形

乐乐最近玩起了字符游戏,规则是这样的:读入四行字符串,其中的字母都是大写的,乐乐想打印一个柱状图显示每个大写字母的频率。你能帮助她吗? 

输入格式

输入文件共有4行:每行为一串字符,不超过72个字符。

输出格式

与样例的格式保持严格的一致。

输入/输出例子1

输入:

THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.

THIS IS AN EXAMPLE TO TEST FOR YOUR

HISTOGRAM PROGRAM.

HELLO!

输出:

2022-04-07_105418.jpg

#include<bits/stdc++.h>
using namespace std;
int s[50],mx,i,j,k,l;
string ss;
int main(){
    for(i=1;i<=4;i++){
        getline(cin,ss);
        l=ss.length();
        for(j=0;j<l;j++){
            if(ss[j]>='A'&&ss[j]<='Z'){
                s[ss[j]-'A']++;
                mx=max(mx,s[ss[j]-'A']);
            }
        }
    }
    for(i=mx;i>=1;i--){
        for(j=0;j<=25;j++){
            if(s[j]>=i)printf("*");
            else printf(" ");
            printf(" ");
        }
        printf("\n");
    }
    for(k=0;k<26;k++){
    	printf("%c ",k+'A');
    }
    return 0;
}

 

第8题     机器人交警

某座城市一共有26个交通路口,分别用大写英文字母A、B、……、Z表示。交通管理部门研制了一批机器人交通警察,并按如下的规则派出这些机器人到交通路口协助指挥交通:

⑴每次派出两名机器人;

⑵当两名机器人的名字中存在一个相同的字母时,这两名机器人便到对应的交通路口上指挥交通;有多个字母相同时,两名机器人需要按字母的先后次序到这些路口上巡逻。

⑶当两名机器人的名字中不存在相同的字母时,交警部门的派出指令无效(WuXiao)。

假设这些机器人的名字全由大写字母组成。请你编一个程序,来指挥这些机器人交警的工作。

输入格式

第一行输入第一个机器人的名字;

第二行输入第二个机器人的名字。

输出格式

⑴当不能派出机器人时,在第一行输出"WuXiao";

⑵当两名机器人在路口上指挥交通时,在第一行输出"ZhiHui",第二行输出路口编号;

⑶当两名机器人在路口上巡逻时,在第一行输出"XLuo",第二行输出巡逻的路口数,第三行输出巡逻线路。

输入/输出例子1

输入:

LPT

BYHK

输出:

WuXiao

输入/输出例子2

输入:

KEYDDD

CHEN

输出:

ZhiHui 

E

输入/输出例子3

输入:

OPEN

CLOSE

输出:

XLuo 

2

E-O

输入/输出例子4

输入:

EPSON

SENPUM

输出:

XLuo

4

E-N-P-S

#include<bits/stdc++.h>
using namespace std;
bool cmp(char x,char y){
    if(x!=y){
    	return x<y;
    }
}
int m,n,f,k,s;
string a,b;
char c[10005];
int main(){
    cin>>a>>b;
    m=a.size(),n=b.size();
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            if(a[i]==b[j])
                f=1,c[k]=a[i],s++,k++;
    sort(c,c+k,cmp);
    for(int i=0;i<k-1;i++)
        if(c[i]==c[i+1])
            c[i]='0',s--;
    if(f==1&&s>=2){
        printf("XLuo\n%d\n",s);
        for(int i=0;i<k-1;i++)
            if(c[i]!='0')
            	printf("%c-",c[i]);
        int i=k-1;
        printf("%c",c[i]);
    }
    if(f==1&&s<2)printf("ZhiHui\n%c",c[0]);
    if(f==0)printf("WuXiao");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值