只出现一次的字符
给你一个只包含小写字母的字符串。
请你判断是否存在只在字符串中出现过一次的字符。
如果存在,则输出满足条件的字符中位置最靠前的那个。
如果没有,输出 no。
输入格式
共一行,包含一个由小写字母构成的字符串。
数据保证字符串的长度不超过 100000。
输出格式
输出满足条件的第一个字符。
如果没有,则输出 no。
输入样例:
abceabcd
输出样例:
e
我们需要一个数组,通过数组来记录每一个字符出现的次数,其中每个字符对应的数组下标分别是他们对应的ascll码减去a的ascll码
等到遍历一遍后,我们在遍历一遍记录数组,找到其中值为一的那个数组,然后用他的下标加上小a的ascll码即是答案的ascll码,输出即可
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[26];
int main()
{
string s1;
cin>>s1;
int len=s1.size();
for(int i=0;i<len;i++){
a[s1[i]-'a']++;
}
for(int i=0;i<len;i++){
if(a[s1[i]-'a']==1){
cout<<s1[i]<<endl;
return 0;
}
}
puts("no");
return 0;
}
信息加密
在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。
现在给定一个字符串,对其进行加密处理。
加密的规则如下:
字符串中的小写字母,a 加密为 b,b 加密为 c,…,y 加密为 z,z 加密为 a。
字符串中的大写字母,A 加密为 B,B 加密为 C,…,Y 加密为 Z,Z 加密为 A。
字符串中的其他字符,不作处理。
请你输出加密后的字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出加密后的字符串。
数据范围
输入字符串的长度不超过 100。
输入样例:
Hello! How are you!
输出样例:
Ifmmp! Ipx bsf zpv!
此题的关键是如何让我们的z加上后变回a,当然可以用判断语句来实现,不过我们其实还可以运用取模来运算,即将字符串中的每一个字母通过减去其区间上的第一个数(小a和大A)然后通过题目知我们要给每个字符加一,所以我们加一,然后整体对26取模(因为每个区间不管是adaoz还是A到Z都是二十六个)后再加上起始位置的ascll码(小a和大A)即可
判断代码如下:
if(s1[i]>='a'&&s1[i]<='z'){
s1[i]='a'+(s1[i]-'a'+1)%26;
}else if(s1[i]>='A'&&s1[i]<='Z'){
s1[i]='A'+(s1[i]-'A'+1)%26;
}
整体代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s1;
getline(cin,s1);
int len=s1.size();
for(int i=0;i<len;i++){
if(s1[i]>='a'&&s1[i]<='z'){
s1[i]='a'+(s1[i]-'a'+1)%26;
}else if(s1[i]>='A'&&s1[i]<='Z'){
s1[i]='A'+(s1[i]-'A'+1)%26;
}
}
cout<<s1<<endl;
return 0;
}
输出字符串
给定一个字符串 a,请你按照下面的要求输出字符串 b。
给定字符串 a 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到 b 的第一个字符;
给定字符串 a 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到 b 的第二个字符;
…
给定字符串 a 的倒数第二个字符的 ASCII 值加最后一个字符的 ASCII 值,得到 b 的倒数第二个字符;
给定字符串 a 的最后一个字符的 ASCII 值加第一个字符的 ASCII 值,得到 b 的最后一个字符。
输入格式
输入共一行,包含字符串 a。注意字符串中可能包含空格。
数据保证字符串内的字符的 ASCII 值均不超过 63。
输出格式
输出共一行,包含字符串 b。
数据范围
2≤a的长度≤100
输入样例:
1 2 3
输出样例:
QRRSd
此题也与上题一样,虽然我们可以通过判断语句判断,但是我们其实也可以像上题一样,通过取模运算来运算,修改判断语句,就像这样:
for(int i = 0; i < a.size(); ++i)
cout << (char)(a[i] + a[(i + 1) % a.size()]);
这里同样是将数组要加的数组进行了取模运算,这样当他到最后一个的时候就可以加上第一个数,满足了题目要求,简化了代码
代码如下:
#include <iostream>
using namespace std;
int main() {
string a;
getline(cin, a);
for(int i = 0; i < a.size(); ++i)
cout << (char)(a[i] + a[(i + 1) % a.size()]);
return 0;
}
单词替换输入一个字符串,以回车结束(字符串长度不超过 100)。
该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。
现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入格式
输入共 3 行。
第 1 行是包含多个单词的字符串 s;
第 2 行是待替换的单词 a(长度不超过 100);
第 3 行是 a 将被替换的单词 b(长度不超过 100)。
输出格式
共一行,输出将 s 中所有单词 a 替换成 b 之后的字符串。
输入样例:
You want someone to help you
You
I
输出样例:
I want someone to help you
首先我们需要读进去三个字符串,因为有空格所以要用到可以读入空格的方式,即getline,而另外的两个字符串只有一个单词故而可以用cin来读入,这时我们还需要用到stringstream,在sstream 的类里面
实现stringstream:stringstream ssin(s1);
定义了一个ssin,初始化成一个字符串流,用法与cin一样,只不过是从字符串中读信息
代码如下:
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
string s1,a,b;
getline(cin,s1);
cin>>a>>b;
stringstream ssin(s1);
string str;
while(ssin>>str){//一直读
if(str==a){//如果等于a就输出b
cout<<b<<' ';
}else{
cout<<str<<' ';
}
}
return 0;
}