字符串中找整数
问题描述
对于一个字符串,编程找出其中的所有整数。例如,字符串“a12bc34d05”,其中有整数12、34、5。
总结
1. 遍历字符串时需判断字符是否为数字,通过isdigit()函数可快速判定字符是否是 0-9 的数字字符
2. 提取连续数字字符拼接为整数:遇到数字字符时,通过num = num * 10 + (s[i] - '0')的方式累加计算,非数字字符时完成当前整数提取并重置临时变量
3. 需处理字符串首尾为数字、连续多个数字、单个数字以及包含 0 开头数字(按常规整数提取)的情况,确保所有整数都被正确识别
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<int> find_num(string s) {
vector<int> res;
int num = 0;
bool flag = false;
for (int i = 0; i < s.size(); ++i) {
char c = s[i];
if (c >= '0' && c <= '9') {
num = num * 10 + (c - '0');
flag = true;
} else {
if (flag) {
res.push_back(num);
num = 0;
flag = false;
}
}
}
if (flag) {
res.push_back(num);
}
return res;
}
int main() {
string line;
while (getline(cin, line)) {
vector<int> nums = find_num(line);
cout << nums.size();
for (int i = 0; i < nums.size(); ++i) {
cout << " " << nums[i];
}
cout << endl;
}
return 0;
}
乒乓球
问题描述
国际乒联主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。明明就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,明明首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。 (注:11(21)分制,在一局比赛中,选手A先得到11(21)分且此时领先选手B 2分或2分以上时,则选手A赢得此局;若当双方打成10(20)平后,则先多得2分的一方为胜方,赢得此局。)
明明通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。一局比赛的开始比分为0比0。 比如现在有这么一份记录,(其中W表示明明获得一分,L表示明明的对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是明明第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。
在21分制下,此时比赛结果是明明第一局21比0获胜,正在进行第二局,当前比分2比1。
再如有这么一份记录,(其中W表示明明获得一分,L表示明明的对手获得一分):
WLWLWLWLWLWLWLWLWLWLWLWLWL
在11分制下,此时比赛的结果是明明和对手打成13比13,这局比赛仍没有分出胜负,因为任何一方都没有领先其对手2分。
在21分制下,此时比赛的结果是明明和对手打成13比13,这局比赛仍在进行中。
由于明明参加过多年的比赛,比赛的数据量相当庞大,如果仅仅使用手工统计,在短时间内统计出结果对于明明来说是相当困难的。因此明明求助于你,希望你能写一个程序,帮助他快速地统计出结果来。
明明的问题可以归结为:给你一系列的比赛数据(WL形式),分别按照11分制和21分制的比赛规则进行统计,然后输出统计结果。
总结
1. 需分别按照 11 分制和 21 分制的规则独立统计比赛结果,核心规则为达到对应分值且领先 2 分及以上获胜,打平至 10/20 后需多得 2 分方可获胜
2. 统计时需初始化双方得分、局数,遍历比赛结果字符串(W/L)逐球累计对应选手得分
3. 每累计一次得分后,需立即判断当前局是否满足获胜条件,满足则结算该局,重置双方得分进入下一局,不满足则继续统计
4. 遍历结束后,若当前局未分胜负,需输出当前局的实时比分;已分胜负的局,按顺序输出各局结果
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<int> find_num(string s) {
vector<int> res;
int num = 0;
bool flag = false;
for (int i = 0; i < s.size(); ++i) {
char c = s[i];
if (c >= '0' && c <= '9') {
num = num * 10 + (c - '0');
flag = true;
} else {
if (flag) {
res.push_back(num);
num = 0;
flag = false;
}
}
}
if (flag) {
res.push_back(num);
}
return res;
}
int main() {
string line;
while (getline(cin, line)) {
vector<int> nums = find_num(line);
cout << nums.size();
for (int i = 0; i < nums.size(); ++i) {
cout << " " << nums[i];
}
cout << endl;
}
return 0;
}
字符串统计
问题描述
明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串s1和s2,明明需要统计出以下四种关系:
(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);
(2)在s1中且在s2中的字母;
(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;
(4)不在s1中且也不在s2中的字母;
例如两个字符串s1为“lkjsvoahs”,s2为“qglhskjdfg”:
(1)在s1或者在s2或者s1、s2中都存在的字母:adfghjkloqsv;
(2)在s1中且在s2中的字母:hjkls;
(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母:adfgoqv;
(4)不在s1中且也不在s2中的字母:bceimnprtuwxyz;
明明统计了很久,但是由于统计过程十分繁琐,且很容易出错,导致明明的进度非常慢,很有可能因为统计不完而错过了晚上的约会。因此明明想请你帮个忙,帮他写一个程序,用程序来统计出以上几项内容。
明明的问题可以归结为:
输入两串由小写字母组成的字符串s1和s2,比较其中的字母,输出以下四项,输出的字母以字典顺序排列:
(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);
(2)在s1中且在s2中的字母;
(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;
(4)不在s1中且也不在s2中的字母;
例如字符串s1为sadf,s2为asdf,则需输出以下四行(注意输出的格式):
in s1 or s2:adfs
in s1 and s2:adfs
in s1 but not in s2 ,or in s2 but not in s1:
not in s1 and s2:bceghijklmnopqrtuvwxyz
总结
1. 利用集合的特性处理字母的交、并、差集,可快速实现四种关系的统计,集合会自动去重,适配字母重复出现的场景
2. 先将两个字符串转换为存储单个字母的集合,通过集合运算直接获取:并集(s1∪s2)对应 s1 或 s2 中存在的字母、交集(s1∩s2)对应 s1 且 s2 中存在的字母、对称差集(s1^s2)对应 s1 和 s2 互不存在的字母
3. 预设包含 26 个小写字母的全集,通过全集减去并集,得到不在 s1 且不在 s2 中的字母
4. 所有结果需按字典顺序排序后输出,可将集合转换为字符串 / 数组后使用sort()函数排序
5. 处理输出格式,严格按照指定的前缀和格式输出,若某类结果无字母需输出空内容
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
using namespace std;
void deal(string s1, string s2) {
set<char> a, b, all_char;
// 初始化26个小写字母全集
for (char c = 'a'; c <= 'z'; ++c) {
all_char.insert(c);
}
// 填充字符串对应的集合
for (int i = 0; i < s1.size(); ++i) a.insert(s1[i]);
for (int i = 0; i < s2.size(); ++i) b.insert(s2[i]);
// 计算并集
set<char> c1;
set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(c1, c1.begin()));
// 计算交集
set<char> c2;
set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(c2, c2.begin()));
// 计算对称差集
set<char> c3;
set_symmetric_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(c3, c3.begin()));
// 计算补集
set<char> c4;
set_difference(all_char.begin(), all_char.end(), c1.begin(), c1.end(), inserter(c4, c4.begin()));
// 输出结果
cout << "in s1 or s2:";
for (set<char>::iterator it = c1.begin(); it != c1.end(); ++it) cout << *it;
cout << endl;
cout << "in s1 and s2:";
for (set<char>::iterator it = c2.begin(); it != c2.end(); ++it) cout << *it;
cout << endl;
cout << "in s1 but not in s2 ,or in s2 but not in s1:";
for (set<char>::iterator it = c3.begin(); it != c3.end(); ++it) cout << *it;
cout << endl;
cout << "not in s1 and s2:";
for (set<char>::iterator it = c4.begin(); it != c4.end(); ++it) cout << *it;
cout << endl;
}
int main() {
string s1, s2;
vector<string> lines;
while (getline(cin, s1)) {
if (!s1.empty()) lines.push_back(s1);
}
for (int i = 0; i < lines.size(); i += 2) {
if (i + 1 >= lines.size()) break;
s1 = lines[i];
s2 = lines[i+1];
deal(s1, s2);
if (i != lines.size() - 2) {
cout << endl;
}
}
return 0;
}
计算机英语翻译
二、计算机科学的发展
20世纪40年代末和50年代初,计算机科学领域的早期研究主要集中在实现科学和工程计算过程的自动化。科学家和工程师们建立了计算的理论模型,从而能够分析不同计算方法的效率。当时,计算机科学与数学中的一个分支——数值分析有相当大的重叠,数值分析主要研究如何高效地进行各种计算的准确性和精度。
单词打卡

540



被折叠的 条评论
为什么被折叠?



