机试笔记4--字符串

字符串相关基础知识

默认在c++环境下,加入头文件#include <cstring>,如果要使用c的char str[]来表示字符串,输入一串字符串可以使用gets(),但不可以使用c++的getline

可以使用sort(str,str+strlen())来进行字符串排序。

也可以使用string str,加入头文件#include <string>,可以通过getline进行输入,排序则使用sort(str.begin(),str.end());来进行排序。

 字符串查找函数,find(查找内容),未找到返回-1

题型1.统计字符

    这里要注意的就是统计变量count要在每次统计完一个字符后清零。

题型2.大小写转换

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

   这道题要注意"如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。"也就是说可能有大写的情况,第一个字母和后面的字母要分开处理。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    while(getline(cin,str)){
      for(int i=0;i<str.size();i++){
        if(i==0&&'a'<=str[0]&&str[0]<='z')
            str[0]=str[0]-'a'+'A';
        else {
          if(str[i-1]==' '||str[i-1]=='\t'||str[i-1]=='\r'||str[i-1]=='\n'){
            if('a'<=str[i]&&str[i]<='z')
                str[i]=str[i]-'a'+'A';
          }    
        }
      }
      cout << str<<endl;
    }
    return 0;
}

题型三.统计子串出现次数

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    int sum_m=0;
    for(int i=0;i<b.size();i++){
            int flag=0;
            for(int j=0;j<a.size();j++){
                if(a[j]!=b[i+j])
                    flag=1;
            }
            if(flag==0)
              sum_m++;
    }
    cout << sum_m<<endl;
    return 0;
}

题型四.字符串加密

编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E、C->F、......、Y->B、Z->C。小写字母同上,其他字符不做转化。输入任意字符串,输出加密后的结果。

  要注意的就是x到z的转化,第一种方法是

           if(s[i]>'z')  s[i]-=26;

第二种方法是

       s[i] = 'a'+(s[i]+3-'a')%26;

题型四.字符串删除

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    int index[105]={0};
    for(int i=0;i<b.size();i++){
            int flag=0;
            for(int j=0;j<a.size();j++){
                if(a[j]!=b[i+j]){
                    flag=1;
                }
            }
            if(flag==0){
                for(int k=i;k<i+a.size();k++)
                    index[k]=1;
            }
    }
    for(int i=0;i<b.size();i++)
    {
        if(index[i]==0)
            cout << b[i];
    }
    cout << endl;
    return 0;
}

 如果题目要求不区分大小写,一律删除,可以先把字符串转化成全小写,再进行

for(int i=0;i<b.size();i++){
      if('A'<=b[i]&&b[i]<='Z'){
        btype[i]=b[i]-'A'+'a';
      }
      else
        btype[i]=b[i];
    }

 将一个字符串中的某个单词替换成另一个单词

#include<iostream>
#include<cstring>
#include<string>
#include<vector>

using namespace std;

int main() {
    string s, a, b;
    vector<string> v;
    do
    {//分割单词填装进vector中,当输入回车就结束循环
        cin >> s;
        v.push_back(s);
    } while (cin.get() != '\n');
    cin >> a >> b;//接收待替换字符串和要替换成的字符串
    for (int i = 0;i < v.size();i++) {//开始遍历vector,并输出
        if (v[i] == a) {//是目标字符串就替换掉
            v[i] = b;
        }
        if(i != v.size() - 1){//完成操作后开始输出,这里注意空格问题
            cout << v[i] << " ";
        }
        else {
            cout << v[i];
        }

    }

    return 0;
}

 例题,输出不同的字符串

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    set<string> s;
    while(n--){
        string str;
        cin>>str;
        s.insert(str);
    }
    cout<<s.size()<<endl;
}

可以利用set来计算,如果还要知道各个相同的字符串的个数,可以使用map

posted @ 2020-03-29 13:22  不二良  阅读(164)  评论(0编辑  收藏  举报