天梯赛字符串题好像挺多,以本周训练赛为切入点进行总结。
一.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")