4 条题解
-
7
题解
这道题有一个很简单的做法,
我最开始写了一个特别复杂的。 我们先输入,顺便把 都变成小写:#include <bits/stdc++.h> using namespace std; string f, s; int main() { cin >> f; // 这里string使用cin读入 cin.ignore(); // 忽略换行符,getchar();也可以 getline(cin, s); // 整行读入s // 如果不忽略换行符,则getline会直接读到上面的cin >> f剩下的回车,直接结束。 for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') // 判断 s[i] = s[i] - 'A' + 'a'; // 修改 } return 0; }
我们可以把主字符串(就是第二个字符串)按空格分解。
#include <bits/stdc++.h> using namespace std; string f, s, nxt; vector<string> sp; int main() { // cin, getline输入 cin >> f; cin.ignore(); getline(cin, s); nxt = ""; // 最开始目前这一字符串为空 for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a'; if (s[i] == ' ') // 空格 { sp.push_back(nxt); // 把nxt压进去 nxt = ""; // 清空 } else { nxt += s[i]; // 直接加到nxt里 } } sp.push_back(nxt); // 最后没有空格把nxt压进去,我们手动压进去 return 0; }
接下来我们可以枚举所有 ,当 时说明找到一个单词,让 。
#include <bits/stdc++.h> using namespace std; int cnt = 0; string f, s, nxt; vector<string> sp; int main() { // cin, getline输入 cin >> f; cin.ignore(); getline(cin, s); nxt = ""; for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a'; if (s[i] == ' ') { sp.push_back(nxt); nxt = ""; } else { nxt += s[i]; } } sp.push_back(nxt); for (int i = 0; i < sp.size(); i++) { if (sp[i] == f) // 成立 { cnt++; // 统计 } } if (cnt == 0) printf("-1\n"); // 没有 return 0; }
当 时说明没有,输出
-1
。 可是题目还让我们计算第一次出现的字符位置,我们可以通过记录一个 vector ,来保存所有空格的下一位,在第一次出现时可以让 。#include <bits/stdc++.h> using namespace std; int cnt = 0, first = -1; string f, s, nxt; vector<int> p; vector<string> sp; int main() { // cin, getline输入 cin >> f; cin.ignore(); getline(cin, s); p.push_back(0); // 最开始第一个单词也有可能,所以要把第一个开头0也加进去 nxt = ""; for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a'; if (s[i] == ' ') { p.push_back(i + 1); // 记录空格的下一个 sp.push_back(nxt); nxt = ""; } else { nxt += s[i]; } } sp.push_back(nxt); for (int i = 0; i < sp.size(); i++) { if (sp[i] == f) { cnt++; if (first == -1) first = p[i]; // 当first = -1时,说明为第一个 } } if (cnt == 0 && first == -1) printf("-1\n"); else printf("%d %d\n", cnt, first); return 0; }
#include <bits/stdc++.h> using namespace std; int cnt = 0, first = -1; string f, s, nxt; vector<int> p; vector<string> sp; int main() { cin >> f; cin.ignore(); getline(cin, s); p.push_back(0); nxt = ""; for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a'; if (s[i] == ' ') { p.push_back(i + 1); sp.push_back(nxt); nxt = ""; } else { nxt += s[i]; } } sp.push_back(nxt); for (int i = 0; i < sp.size(); i++) { if (sp[i] == f) { cnt++; if (first == -1) first = p[i]; } } if (cnt == 0 && first == -1) printf("-1\n"); else printf("%d %d\n", cnt, first); return 0; }
-
2
#include <iostream> #include <vector> using namespace std; vector<string> vec; string s, ss, txt = ""; int ans, pos; int main() { cin >> s; for (int i = 0; i < (int)s.length(); i++) if (s[i] <= 'Z' && s[i] >= 'A') s[i] += 32; cin.ignore(); getline(cin, ss); for (int i = 0; i < (int)ss.length(); i++) { if (ss[i] <= 'Z' && ss[i] >= 'A') ss[i] += 32; if (ss[i] == ' ') { vec.push_back(txt); txt = ""; } else txt += ss[i]; } vec.push_back(txt); bool flag = true; for (int i = (int)vec.size() - 1; i >= 0; i--) { if (vec[i] == s) { ans++; pos = i; flag = false; } } int t_pos = 0; for (int i = 0; i < pos; i++) { t_pos++; t_pos += (int)vec[i].length(); } if (flag) cout << -1; else cout << ans << ' ' << t_pos; }
-
1
主要知识 https://blog.csdn.net/ONE_KICK/article/details/126196478 在360极速浏览器打开
#include <bits/stdc++.h> using namespace std; string a,b; int main(){ getline(cin,a); getline(cin,b);//输入一整行 for (int i=0;i<a.length();i++){ a[i]=tolower(a[i]); } for (int i=0;i<b.length();i++){ b[i]=tolower(b[i]); }//转成小写 a=' '+a+' '; b=' '+b+' ';//比较容易配对 if (b.find(a)==string::npos){ cout<<-1; }//判断 else{ int al=b.find(a);//单词最先出现的位置 int bl=b.find(a); int s=0;//答案 while(bl!=string::npos){ s++; bl=b.find(a,bl+1);//下一个判断 } cout<<s<<" "<<al<<endl;//输出答案 } return 0; }
-
0
这个题我也是暴力的做法,首先把两个字符串都转成了小写,其次第二个字符串带空格,我们可以用getline读入它。
然后我分离了第二个字符串存到了一个vector里,并且把空格也单独存了一次。
for (int i = 0; i < b.length(); ++i) { b[i] = tolower(b[i]);//转小写 if ((b[i] == ' ') || i == b.length() - 1) { v.push_back(s);//不仅存s,也存一次空格 v.push_back(" "); s = "";//清空s } if (b[i] != ' ')//记录当前单词情况 s += b[i]; }
然后开始寻找出现次数,遍历vector就得到了
寻找第一个位置,也是遍历一次
#include <bits/stdc++.h> using namespace std; string s; vector<stirng> v; int main() { string a, b; getline(cin, a); getline(cin, b); for (int i = 0; i < a.length(); ++i) { a[i] = tolower(a[i]); } for (int i = 0; i < b.length(); ++i) { b[i] = tolower(b[i]); if ((b[i] == ' ') || i == b.length() - 1) { v.push_back(s); v.push_back(" "); s = ""; } if (b[i] != ' ') s += b[i]; } int ans = 0; for (int i = 0; i < v.size(); i++) { if (v[i] == a) ans++; } int ans2 = 0; for (int i = 0; i < v.size(); i++) { if (v[i] != a) { ans2 += v[i].length(); } if (v[i] == a) { break; } } if (ans != 0) cout << ans << " " << ans2; else cout << -1; return 0 }
- 1
信息
- ID
- 1550
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 237
- 已通过
- 75
- 上传者