如何提取工号与工时并统计出月工时最长的工人?
解决思路与代码改进
核心问题分析
原代码仅读取了文件中的行内容,但未从固定格式的字符串中提取关键的工号(x)和工时(y)。由于输入行格式固定为「Worker x worked y hours.」,我们可以利用C++输入流的特性,直接跳过无关字符串,精准提取数字信息。
具体实现步骤
- 数据存储:工号范围为1-10000,使用数组存储每个工人的总工时最为高效(数组索引对应工号,值对应总工时);若工号不连续,也可使用
map<int, int>动态存储。 - 输入解析:针对每一行,通过
cin依次读取固定无关字符串(如"Worker"、"worked"),直接提取工号和工时数字。 - 计算最大值:遍历存储容器,找出总工时最大的工号。
改进后的完整代码
#include <iostream> #include <fstream> using namespace std; const int MAX_WORKER = 10001; // 工号范围1-10000,数组开10001避免越界 int main() { ifstream fin("date.in"); int n; fin >> n; int hours[MAX_WORKER] = {0}; // 初始化所有工时为0 string dummy; // 存储无关字符串 int x, y; for (int i = 0; i < n; ++i) { // 按固定格式读取,跳过无关内容 fin >> dummy >> x >> dummy >> y >> dummy; hours[x] += y; // 累加对应工人的工时 } // 找出工时最多的工人编号 int max_hours = 0; int result_worker = 0; for (int i = 1; i < MAX_WORKER; ++i) { if (hours[i] > max_hours) { max_hours = hours[i]; result_worker = i; } } cout << result_worker << endl; fin.close(); return 0; }
备选方案(用stringstream处理整行)
若坚持使用getline读取整行,可通过stringstream解析每行内容:
#include <iostream> #include <fstream> #include <sstream> #include <string> using namespace std; const int MAX_WORKER = 10001; int main() { ifstream fin("date.in"); int n; fin >> n; fin.ignore(); // 忽略n后的换行符,避免第一个getline读取空行 int hours[MAX_WORKER] = {0}; string line; for (int i = 0; i < n; ++i) { getline(fin, line); stringstream ss(line); string dummy; int x, y; ss >> dummy >> x >> dummy >> y >> dummy; hours[x] += y; } int max_hours = 0, result = 0; for (int i = 1; i < MAX_WORKER; ++i) { if (hours[i] > max_hours) { max_hours = hours[i]; result = i; } } cout << result << endl; fin.close(); return 0; }
关键说明
- 数组存储的优势是访问速度快,适合工号范围明确的场景;若工号范围不确定,替换为
map<int, int>即可。 - 注意
fin >> n会在输入流中留下换行符,需用fin.ignore()或读取空行的方式避免后续读取错误。
内容的提问来源于stack exchange,提问作者popescubianca
相关产品推荐
相关产品推荐

