版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/88537294
1. 输入一组单词(区分大小写), 统计首字母相同的单词的个数,相同的单词不累加,输出格式:“字母,个数”
思路来源:参考
#include <iostream>
#include <map>
#include <set>
using namespace std;
int main()
{
set<string> s;
map<char,int> m;
string str;
while(cin>>str)
{
if(str=="#") break;
s.insert(str);//集合元素唯一,去重
}
set<string>::iterator it;
for(it=s.begin(); it!=s.end(); it++)
{
++m[(*it)[0]];//键唯一 ,键去重 ,值++
}
map<char,int>::iterator mit;
for(mit=m.begin(); mit!=m.end(); mit++)
{
cout<<mit->first<<" "<<mit->second<<endl;
}
return 0;
}
这里我没使用stl函数,就比较麻烦一点,但是思路是一样的,如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
1. 输入一组单词(区分大小写), 统计首字母相同的单词的个数,相同的单词不累加,输出格式:“字母,个数”
*/
typedef struct res{
string letter;
int count;
}result;
bool ishas(vector<string> vb, string s){
for(int i=0;i<vb.size();i++){
if(vb[i]==s)
return true;
}
return false;
}
bool ishasletter(vector<result>& vd, string s){
for(int i=0;i<vd.size();i++){
if(vd[i].letter==s.substr(0,1)){
vd[i].count++;
return true;
}
}
return false;
}
int main()
{
string str;
vector<string> vc;
vector<string> vb;
vector<result> vd;
cout<<"请输入单词,输入#结束"<<endl;
while(cin>>str){
if(str=="#")
break;
vc.push_back(str);
}
//先排序
sort(vc.begin(), vc.end());
// for(int i=0;i<vc.size();i++)
// cout<<vc[i]<<" ";
// cout<<endl;
//再去重
for(int i=0;i<vc.size();i++){
if(!ishas(vb, vc[i])){
vb.push_back(vc[i]);
}
}
// for(int i=0;i<vb.size();i++)
// cout<<vb[i]<<" ";
// cout<<endl;
//再计数
for(int i=0;i<vb.size();i++){
if(!ishasletter(vd, vb[i])){
result *r = new result;
r->letter = vb[i].substr(0,1);
r->count = 1;
vd.push_back(*r);
}
}
//再显示
for(int i=0;i<vd.size();i++){
cout<<vd[i].letter<<", "<<vd[i].count<<endl;
}
//ab abc abca ba ab abc cc dd d a c a
//a a ab ab abc abc abca ba c cc d dd
//a ab abc abca ba c cc d dd
return 0;
}
2. 输入一组单词,(区分大小写),输出其字典排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
输入一组单词,(区分大小写),输出其字典排序
*/
int main()
{
string str;
vector<string> vc;
cout<<"请输入单词,输入#结束"<<endl;
while(cin>>str){
if(str=="#")
break;
vc.push_back(str);
}
//先排序
sort(vc.begin(), vc.end());
for(int i=0;i<vc.size();i++)
cout<<vc[i]<<" ";
cout<<endl;
return 0;
}
3. 给一个字符串(aaaa(bbbb(cccc,dddd),eeee(ffff)))该字符串
表明的是各人的层次关系
比如aaaa是bbbb和eeee的领导,bbbb是cccc和dddd的领导
现输入一个名称,比如ffff,要求输出其领导关系
输出:aaaa>eeee>ffff
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
3. 给一个字符串(aaaa(bbbb(cccc,dddd),eeee(ffff)))该字符串
表明的是各人的层次关系
比如aaaa是bbbb和eeee的领导,bbbb是cccc和dddd的领导
现输入一个名称,比如ffff,要求输出其领导关系
输出:aaaa>eeee>ffff
*/
int main()
{
string str1, str2, str="";
vector<string> vc;
cout<<"请输入字符串:"<<endl;
cin>>str1;
cout<<"请输入要查找的字符串:"<<endl;
cin>>str2;
char stack[20];
int top=0;
int pos = str1.find(str2);
cout<<pos<<endl;
str.append(str2);
int count=0, index=0, number=0;
for(int i=pos;i>=0;i--){//思路,处理字符串,匹配括号,截取字符串 联想到括号匹配,这里对栈的处理进行了变形
/*
//(aaaa(bbbb(cccc,dddd),eeee(ffff)))
//top 3 2 1 0 1
如ffff
在top==1 && 字符为'('时,处理字符串,在结果字符串中:加入eeee> ,变成eeee>ffff
在top==2 && 字符为'('时,处理字符串,在结果字符串中:加入aaaa>,变成aaaa>eeee>ffff
top==3时,满足,这里不写出来,因为后面我们会去掉
同理:
如eeee
//(aaaa(bbbb(cccc,dddd),eeee(ffff)))
//top 2 1 0 1
在top==1 && 字符为'('时,处理字符串,在结果字符串中:加入aaaa> ,变成aaaa>ffff
同理top==2不写出来
*/
if(str1[i]==')'){
top--;
cout<<top<<" )"<<endl;
}else if(str1[i]=='('){
top++;
//stack[top]='(';
cout<<top<<" ("<<endl;
}
if(index!=0){
cout<<"str1[i]="<<str1[i]<<endl;
if(str1[i]==',' or str1[i]=='('){
string s = str1.substr(index-count, count);
str.insert(0,s);
count=0;
index=0;
number++;//第几个
}else{
count++;
}
cout<<"index="<<index<<",count="<<count<<endl;
}
if(str1[i]=='(' and top==number+1){
str.insert(0,">");
index = i;
}
}
cout<<str.substr(1)<<endl;
return 0;
}
还有一种解法,这里我还没看:
#include <iostream>
#include <string>
using namespace std;
int main()
{
//(aaaa(bbbb(cccc,dddd),eeee(ffff)))
int n=0;
string s,str[105],t;//str为字符串栈
cin>>s>>t;
for(int i=0; i<s.length(); i++)
{
if(s[i]=='(')
{
str[n++]=s[i];
}
else if(s[i]==',')//遇到逗号时将逗号和前一个左括号之间的内容删除
{
for(int k=n-1; k>=0; k--)
{
if(str[k]!="(")
n--;
else if(str[k]=="(")
{
break;
}
}
}
else if(s[i]==')')//遇到右括号将右括号和前一个左括号之间的内容和左括号删除
{
for(int k=n-1; k>=0; k--)
{
if(str[k]!="(")
n--;
else if(str[k]=="(")
{
n--;
break;
}
}
}
else//字母或数字
{
int j;
string tt="";
for(j=i; j<s.length(); j++)
{
if((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z'))
tt+=s[j];
else
{
str[n++]=tt;
break;
}
}
if(tt==t)//找到目标字符串则退出循环
break;
i=j-1;
}
}
for(int i=0; i<n; i++)
{
if(str[i]!="(")
{
if(str[i]!=t)
cout<<str[i]<<">";
else
cout<<str[i];
}
}
cout<<endl;
return 0;
}
作者:无涯明月
上篇: 北理复试上机题2010年