字符串专题

天梯赛字符串题好像挺多,以本周训练赛为切入点进行总结。

一.7-5 6翻了

 代码如下:

#include<iostream>
using namespace std;
int main(){
    string str;
    getline(cin,str);
    for(int i=0;i<(int)str.size();i++){
        int cnt=0;
        while(str[i]=='6'){//数字符串中连续的6的个数
            ++i;++cnt;
        }
        cout<<(cnt>9?"27":(cnt>3?"9":string(cnt,'6')));
        cout<<str[i];
    }
    return 0;
}

二.7-6 福到了

代码如下:

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

ll get(int x) {
    ll res = 1;
    for (int i = 2; i <= x; i++) {
        res *= i;
    }
    return res;
}


int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    char ch;
    int n;
    cin >> ch >> n;
    string s;
    getline(cin, s);
    
    vector <string> vs(n);
    for (auto&s : vs) {
        getline(cin, s);
    }

    auto vc = vs;
    for (int i = 0; i * 2 < n; i++) {
        swap(vc[i], vc[n-i-1]);
    }
    for (int i = 0; i < n; i++) {
        reverse(vc[n-i-1].begin(), vc[n-i-1].end());
    }

    if (vc == vs) {
        cout << "bu yong dao le\n";
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (vc[i][j] == ' ') cout << ' ';
            else cout << ch;
        }
        cout << '\n';
    }
    
    
}

三.7-7 估值一亿的AI核心代码(难)

代码如下:

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

ll get(int x) {
    ll res = 1;
    for (int i = 2; i <= x; i++) {
        res *= i;
    }
    return res;
}


int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin >> n;
    string s;
    getline(cin, s);
    
    while (n--) {
        getline(cin, s);
        cout << s << "\nAI: ";
        while (s.back() == ' ') s.pop_back();
        reverse(s.begin(), s.end());
        while (s.back() == ' ') s.pop_back();
        reverse(s.begin(), s.end());
        
        string ans;
        
        int cnt = 0;
        for (auto& c : s) {
            if (c == ' ') {
                cnt++;
            } else if (isalpha(c) || isdigit(c)) {
                if (cnt) ans += ' ';
                if (isupper(c) && c != 'I') c -= 'A' - 'a';
                ans += c;
                cnt = 0;
            } else {
                if (c == '?') c = '!';
                ans += c;
                cnt = 0;
            }
        }
        
        auto f = [&] (const string& k, const string&v) {
            int now = -1;
            while ((now = ans.find(k, now + 1)) != ans.npos) {
                int ok = 0;
                if (now - 1 < 0 || !isalpha(ans[now-1]) && !isdigit(ans[now-1])) {
                    ok++;
                }
                if (now + k.size() >= ans.size() || !isalpha(ans[now + k.size()]) && !isdigit(ans[now + k.size()])) {
                    ok++;
                }
                if (ok == 2) {
                    ans.erase(now, k.size());
                    ans.insert(now, v);
                }
            }
        };
        
        f("can you", "IS can");
        f("could you", "IS could");
        f("I", "you");
        f("me", "you");

        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i];
            if (ans[i] == 'I' && i + 1 < ans.size() && ans[i+1] == 'S') {
                i++;
            }
        }
        cout << '\n';

        
        
    }
    
    
}

总结:

常用方法

1.带空格符的字符串输入:getline(cin,str)

2.换行符的输入:getline(cin,str)    ::getchar()(c)

3.字符串的翻转:reverse(vc[n-i-1].begin(), vc[n-i-1].end());

4.string构造函数:

  •             string str1;                         //生成空字符串
  •             string str2("123456789");  //生成"1234456789"的复制品
  •             string str3("12345", 0, 3);  //从0位置开始取三个字符存入,结果为"123"
  •             string str4("012345", 5);    //以前5个作为初值,结果为"01234"
  •             string str5(5, '1');               //以5个字符‘1’作为初值,结果为"11111"
  •             string str6(str2, 2);            //从字符串str2的2位置到str2的末尾截取赋值,结果为"3456789"

5.字符串的比较:成员函数compare str1.compare(str2)

6.查找字符str.rfind str.find返回ch第一次出现的位置

7.判断字符类型

  •         isalnum用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~ z||A~                 Z||0~9。
  •         isalpha()用来判断一个字符是否为字母
  •         isdigit() 用来检测一个字符是否是十进制数字0-9
  •         islower()用来判断一个字符是否为小写字母,也就是是否属于a~z。
  •         isupper用来判断一个字符是否为大写字母。
  •         以上如果满足相应条件则返回非零,否则返回零。

8.字符串类型转换

  •         字符串转整数 stoi  (str)
  •         字符串转浮点数 stof(str)
  •         字符串转双精度浮点数 stod(str)
  •         小写变大写 toupper(ch)
  •         大写变小些tolower(ch)

9.字符串截取 str.substr(2,10)在2位置截取10个字符;

10.字符替换 str.replace(pos,n,s)   用s替换str中从pos开始(包括0)的n个字符的子串

11.在字符串开头添加字符串 str.insert(0,"1234")

     在字符串结尾添加字符串 str.insert(str.size(),"1234")

  • 31
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值