北理复试上机题2011年

版权声明:作者: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年

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/88537294