<span style="font-family: Arial, Helvetica, sans-serif;">1、题目描述
对字符串中的所有单词进行倒排。
说明:
1、每个单词是以26个大写或小写英文字母构成;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
</pre><pre>
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
vector<char> s;
vector <int> in;//找出空格的位置,放在in中
for(int i=0;i<str.size();i++)
{
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
s.push_back(str[i]);
else
{
s.push_back(' ');
in.push_back(i);//空格位置
}
}
vector <int>::iterator vi;
if(!in.empty())
{
for(vi=in.begin();vi!=in.end()-1;vi++)//空格之间为单词,进行翻转
{
reverse(&s[0]+*vi+1,&s[0]+*(vi+1));
}
reverse(&s[0],&s[0]+*(in.begin()));//第一个单词翻转
reverse(&s[0]+*vi+1,&s[0]+s.size());//最后一个单词翻转
reverse(s.begin(),s.end());//字符串整体翻转
}
else
reverse(s.begin(),s.end());//字符串整体翻转
for(int j=0;j<s.size();j++)
cout<<s[j];
cout<<endl;
}
return 0;
}
2、题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
#include "stdio.h"
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
int hash[26]={0};
int i,min=1;
for(i=0;i<str.size();i++)//统计字符出现的次数,同时找出出现次数最小的
{
hash[str[i]-'a']=hash[str[i]-'a']+1;
if(hash[str[i]-'a']<=min)
min=hash[str[i]-'a'];
}
/*for(i=0;i<26;i++)
cout<<hash[i];
cout<<endl<<min<<endl;*/
vector<char>s;
for(i=0;i<str.size();i++)
{
if(hash[str[i]-'a']>min)
s.push_back(str[i]);
}
vector<char>::iterator vi;
for(vi=s.begin();vi!=s.end();vi++)
cout<<*vi;
cout<<endl;
}
return 0;
}
<pre name="code" class="cpp">题目描述
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词死于字母表的下面,如下所示:
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
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
请实现下述接口,通过指定的密匙和明文得到密文。
<p>
</p><pre name="code" class="cpp">#include "stdio.h"
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
void encrypt(string key,string data);//,char * encrypt);//key密匙 data:明文 encrypt:密文
int main()
{
string key,data;
while(cin>>key>>data)
{
encrypt(key,data);
}
return 0;
}
void encrypt(string key,string data)//,char * encrypt)
{
int i,len,len1;
int hash[26]={0};
len=key.size();
vector<char>s1;
for(i=0;i<len;i++)//将key全部转换为大写
{
if(key[i]>='a'&&key[i]<='z')
key[i]=key[i]-32;
}
for(i=0;i<len;i++)//将key去重复
{
if(hash[key[i]-'A']==0)
{
s1.push_back(key[i]);
hash[key[i]-'A']=1;
}
}
len1=s1.size();
for(char a='A';a<='Z';++a)
{
for(i=0;i<len1;i++)
{
if(a==s1[i])
break;
}
if(i==len1)
s1.push_back(a);
}
/* vector<char>::iterator vi;
for(vi=s1.begin();vi!=s1.end();vi++)
cout<<*vi;
cout<<endl;*/
for(i=0;i<data.size();i++)
{
if(data[i]>='a'&&data[i]<='z')
data[i]=s1[data[i]-'a']+32;
else if(data[i]>='A'&&data[i]<='Z')
data[i]=s1[data[i]-'A'];
cout<<data[i];
}
cout<<endl;
return;
}