算法笔记 3.6 字符串处理 codeup课后习题

问题 A: 字符串连接

时间限制: 1 Sec  内存限制: 32 MB

题目描述

不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。

输入

每一行包括两个字符串,长度不超过100。

输出

可能有多组测试数据,对于每组数据,
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
输出连接后的字符串。

样例输入

abc def

样例输出

abcdef

代码:

#include<iostream>
using namespace std;
int main(){
	char a[110],b[110];
	int l1;
	while(cin>>a>>b){
		l1=0;
		for(l1=0;a[l1]!='\0';l1++);//求li长度
		int i;
		for(i=0;b[i]!='\0';i++){
			a[l1+i]=b[i];
		}
		a[l1+i]=b[i];
		cout<<a<<endl;
	}
	return 0;
}

问题 B: 首字母大写

时间限制: 1 Sec  内存限制: 32 MB

题目描述

对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。
在字符串中,单词之间通过空白符分隔,空白符包括:空格(' ')、制表符('\t')、回车符('\r')、换行符('\n')。

输入

输入一行:待处理的字符串(长度小于100)。

输出

可能有多组测试数据,对于每组数据,
输出一行:转换后的字符串。

样例输入

if so, you already have a google account. you can sign in on the right.

样例输出

If So, You Already Have A Google Account. You Can Sign In On The Right.

注意:输入的首字母也可已经是大写

代码:

#include<iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(){
	string s;
	while(getline(cin,s)){//ctrl+z也可停止
		bool flag=true;
		for(int i=0;i<s.length();i++){
			if(s[i]!=' '&&s[i]!='\t'&&s[i]!='\r'&&s[i]!='\n'){
				if(flag){
					if(s[i]>='a'&&s[i]<='z')
						s[i]=s[i]-32;
					flag=false;
				}
			}else{
				flag=true;
			}
		}
		cout<<s<<endl;
	}
	return 0;
}

问题 C: 字符串的查找删除

时间限制: 1 Sec  内存限制: 32 MB

题目描述

给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。

输入

输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。

输出

删除输入的短字符串(不区分大小写)并去掉空格,输出。

样例输入

in
#include 
int main()
{

printf(" Hi ");
}

样例输出

#clude
tma()
{

prtf("Hi");
}

提示

注:将字符串中的In、IN、iN、in删除。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	string rep,line;
	cin>>rep;
	getline(cin,line);//防止多读取一个换行(第一次cin后的换行莫名奇妙被读了)
	while(getline(cin,line)){
		for(int i=0;i<line.length();i++){
			int j;
			for(j=0;j<rep.length();j++){
				//不区分大小写
				if(rep[j]>'A'&&rep[j]<'Z'&&rep[j]!=line[i+j]&&rep[j]+32!=line[i+j]){
					break;
				}else if(rep[j]>'a'&&rep[j]<'z'&&rep[j]!=line[i+j]&&rep[j]-32!=line[i+j]){
					break;
				}
			}
			if(j==rep.length()){
				for(int k=i;k<i+rep.length();k++){
					line[k]=' ';//置为空格 相当于删除(后面空格不输出)
				}
			}
		}
		for(int i=0;i<line.length();i++){
			if(line[i]!=' ') cout<<line[i];
		}
		cout<<endl;
	}
	return 0;
}

问题 D: 单词替换

时间限制: 1 Sec  内存限制: 32 MB

题目描述

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入

多组数据。每组数据输入包括3行,

第1行是包含多个单词的字符串 s,

第2行是待替换的单词a,(长度<=100)

第3行是a将被替换的单词b。(长度<=100)

s, a, b 最前面和最后面都没有空格。

输出

每个测试数据输出只有 1 行,

将s中所有单词a替换成b之后的字符串。

样例输入

I love Tian Qin
I
You

样例输出

You love Tian Qin

c++读取一个字符串:getline(cin,string)   总会多读一次空格或换行 也即是一个字符 多加一个cin.get()可以充当多余的占位冲掉

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	string s,a,b;
	while(getline(cin,s,'\n')){
		cin>>a>>b;
		//cout<<s<<" "<<a<<" "<<b<<endl;
		char x[110];
		int index=0;
		s=s+" ";//最后加一个空格 方便最后一个单词的判断
		for(int i=0;i<=s.length();i++){
			if(s[i]!=' '){
				x[index++]=s[i];
			}else{
				x[index]='\0';
				//cout<<"x:"<<x<<endl;
				if(a==x) cout<<b<<' ';
				else cout<<x<<' ';
				index=0;
			}
		}
		cout<<endl;
		cin.get();//getline()又多读了一次(空格) 覆盖掉  
	}
	
	return 0;
}

问题 E: 字符串去特定字符

时间限制: 1 Sec  内存限制: 32 MB

题目描述

输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。

输入

测试数据有多组,每组输入字符串s和字符c。

输出

对于每组输入,输出去除c字符后的结果。

样例输入

goaod
a

样例输出

good

注意:输入的字符串可能含有空格 \t等        输入的字符c也可能是空格 \t等间隔符。所以字符串读入要getline() 字符读入要cin.get()或getchar()

代码:

#include<iostream>
using namespace std;
int main(){
	string s;
	char c;
	while(getline(cin,s)){
		c=cin.get();
		for(int i=0;i<s.length();i++){
			if(s[i]!=c) cout<<s[i];
		}
		cout<<endl;
		cin.get();//冲掉getline()多读的空格或换行字符
	}
	return 0;
}

问题 F: 数组逆置

时间限制: 1 Sec  内存限制: 32 MB

题目描述

输入一个字符串,长度小于等于200,然后将数组逆置输出。

输入

测试数据有多组,每组输入一个字符串。

输出

对于每组输入,请输出逆置后的结果。

样例输入

<span style="color:#333333">tianqin</span>

样例输出

<span style="color:#333333">niqnait</span>

提示

注意输入的字符串可能会有空格。

代码:

#include<iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
	string s;
	while(getline(cin,s)){
		for(int i=s.length()-1;i>=0;i--){
			cout<<s[i];
		}
		cout<<endl;
	}
	return 0;
}

问题 G: 比较字符串

时间限制: 1 Sec  内存限制: 32 MB

题目描述

输入两个字符串,比较两字符串的长度大小关系。

输入

输入第一行表示测试用例的个数m,接下来m行每行两个字符串A和B,字符串长度不超过50。

输出

输出m行。若两字符串长度相等则输出A is equal long to B;若A比B长,则输出A is longer than B;否则输出A is shorter than B。

样例输入

2
abc xy
bbb ccc

样例输出

abc is longer than xy
bbb is equal long to ccc

代码:

#include<iostream>
#include <string>
using namespace std;
int main(){
	int m;
	string s1,s2;
	cin>>m;
	while(m--){
		cin>>s1>>s2;
		if(s1.length()==s2.length()) cout<<s1<<" is equal long to "<<s2<<endl;
		else if(s1.length()>s2.length()) cout<<s1<<" is longer than "<<s2<<endl;
		else cout<<s1<<" is shorter than "<<s2<<endl;
	}	
	return 0;
}

问题 H: 编排字符串

时间限制: 1 Sec  内存限制: 32 MB

题目描述

请输入字符串,最多输入4 个字符串,要求后输入的字符串排在前面,例如

输入:EricZ

输出:1=EricZ

输入:David

输出:1=David 2=EricZ

输入:Peter

输出:1=Peter 2=David 3=EricZ

输入:Alan

输出:1=Alan 2=Peter 3=David 4=EricZ

输入:Jane

输出:1=Jane 2=Alan 3=Peter 4=David

输入

第一行为字符串个数m,接下来m行每行一个字符床,m不超过100,每个字符床长度不超过20。

输出

输出m行,每行按照样例格式输出,注意用一个空格隔开。

样例输入

5
EricZ
David
Peter
Alan
Jane

样例输出

1=EricZ
1=David 2=EricZ
1=Peter 2=David 3=EricZ
1=Alan 2=Peter 3=David 4=EricZ
1=Jane 2=Alan 3=Peter 4=David

代码:

#include<iostream>
#include <string>
using namespace std;
int main(){
	int n;
	string s,ss[110];
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ss[i];
		for(int j=1;j<=i&&j<=4;j++){
			cout<<j<<"="<<ss[i+1-j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

问题 I: 【字符串】回文串

时间限制: 1 Sec  内存限制: 128 MB

题目描述

读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

输入

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

输出

如果是回文串,输出“YES”,否则输出“NO”。

样例输入

12321

样例输出

YES

代码:

#include<iostream>
#include <string>
using namespace std;
int main(){
	string s;
	while(cin>>s){
		int i;
		for(i=0;i<s.length()/2;i++){
			if(s[i]!=s[s.length()-i-1]) {
				break;
			}
		}
		if(i>=s.length()/2){
			cout<<"YES\n";
		}else{
			cout<<"NO\n";
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/hza419763578/article/details/82912984