某位用户的某次上网行为可以建模成一个三元组{用户 ID、开始时间、结束时 间}。给定一组上网行为数据,编写一个函数,按照用户总上网时长降序返回所 有用户 ID。要求编写的函数 func6 的函数原型如下: vector<int>
时间: 2023-06-26 08:06:12 浏览: 86
func6(vector<vector<int>>& data)
其中,data 是一个二维向量,存储了所有用户的上网行为数据,其中每个元素都是一个包含三个整数的向量,分别表示用户 ID、开始时间和结束时间。函数返回一个整数向量,按照用户总上网时长从大到小排列,只包含所有出现过的用户 ID,不包含重复的用户 ID。
实现思路:
1. 遍历 data,将每个用户的总上网时长记录在一个 unordered_map 中,key 为用户 ID,value 为上网时长。
2. 将 unordered_map 转换为 vector,按照 value 降序排序。
3. 遍历排序后的 vector,将每个元素的 key 加入结果向量中,返回结果向量。
代码实现如下:
相关问题
某位用户的某次上网行为可以建模成一个三元组{用户 ID、开始时间、结束时 间}。给定一组上网行为数据,编写一个函数,按照用户总上网时长降序返回所 有用户 ID。要求编写的函数 func6 的函数原型如下: vector<int> func6(const vector<User_Activity>& activities); 其中,用户自定义类型 User_Activity 的定义如下: struct User_Activity { int id; //用户ID int start_time; //开始时间 int end_time; //结束时间 }; 注意:参数 activities 中一个用户可能有多次上网行为。 比如对于上网行为数据:{1, 0, 10}, {2, 0, 5}, {1, 20, 28}, {3, 0, 20}, {2, 10, 15} 容易看出用户 1 的总上网时长是 10+8=18,用户 2 的总上网时长是 5+5=10,用户 3 的总上网时长是 20。所以最终应该返回的用户 ID 是 3, 1, 2。 此外,你还应该处理输入数据存在问题的情况。正确的数据应该满足 1) 任意一次上网行为的开始时间小于等于结束时间; 2) 任意用户的任意两次上网行为在时间上不重叠。比如{1, 0, 5}, {1, 10, 15}是一 组正确数据,{1, 0, 10}, {1, 10, 15}也是一组正确数据。而{1, 0, 10}, {1, 1, 5}是 一组错误数据,{1, 0, 10}, {1, 5, 15}也是一组错误数据。 如果输入数据存在问题,抛出异常"invalid input" 提示:你可以先处理数据正常情况,测试正确后再考虑数据错误情况
可以按照如下步骤实现函数 func6:
1. 首先判断输入数据是否存在问题,如果存在问题,抛出异常"invalid input"。
2. 对于每个用户,计算其总的上网时长。
3. 将用户 ID 和对应的总上网时长存储在一个 vector 中。
4. 对 vector 按照总上网时长进行降序排序。
5. 提取排序后的 vector 中的用户 ID,存储在一个新的 vector 中并返回。
代码实现如下:
```c++
#include <vector>
#include <algorithm>
#include <stdexcept>
using namespace std;
struct User_Activity {
int id;
int start_time;
int end_time;
};
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
vector<int> func6(const vector<User_Activity>& activities) {
// 判断输入数据是否存在问题
for (int i = 0; i < activities.size(); i++) {
if (activities[i].start_time > activities[i].end_time) {
throw invalid_argument("invalid input");
}
for (int j = i + 1; j < activities.size(); j++) {
if (activities[i].id == activities[j].id) {
if (activities[i].end_time > activities[j].start_time && activities[i].start_time < activities[j].end_time) {
throw invalid_argument("invalid input");
}
}
}
}
// 计算每个用户的总上网时长
vector<pair<int, int>> user_time;
for (const auto& activity : activities) {
bool found = false;
for (auto& p : user_time) {
if (p.first == activity.id) {
p.second += activity.end_time - activity.start_time;
found = true;
break;
}
}
if (!found) {
user_time.emplace_back(activity.id, activity.end_time - activity.start_time);
}
}
// 对 vector 按照总上网时长进行降序排序
sort(user_time.begin(), user_time.end(), cmp);
// 提取排序后的 vector 中的用户 ID
vector<int> result;
for (const auto& p : user_time) {
result.push_back(p.first);
}
return result;
}
```
6. 某位用户的某次上网行为可以建模成一个三元组{用户 ID、开始时间、结束时 间}。给定一组上网行为数据,编写一个函数,按照用户总上网时长降序返回所 有用户 ID。要求编写的函数 func6 的函数原型如下: vector<int> func6(const vector<User_Activity>& activities); 其中,用户自定义类型 User_Activity 的定义如下: struct User_Activity { int id; //用户ID int start_time; //开始时间 int end_time; //结束时间 }; 注意:参数 activities 中一个用户可能有多次上网行为。 比如对于上网行为数据:{1, 0, 10}, {2, 0, 5}, {1, 20, 28}, {3, 0, 20}, {2, 10, 15} 容易看出用户 1 的总上网时长是 10+8=18,用户 2 的总上网时长是 5+5=10,用户 3 的总上网时长是 20。所以最终应该返回的用户 ID 是 3, 1, 2。 此外,你还应该处理输入数据存在问题的情况。正确的数据应该满足 1) 任意一次上网行为的开始时间小于等于结束时间; 2) 任意用户的任意两次上网行为在时间上不重叠。比如{1, 0, 5}, {1, 10, 15}是一 组正确数据,{1, 0, 10}, {1, 10, 15}也是一组正确数据。而{1, 0, 10}, {1, 1, 5}是 一组错误数据,{1, 0, 10}, {1, 5, 15}也是一组错误数据。 如果输入数据存在问题,抛出异常"invalid input" 提示:你可以先处理数据正常情况,测试正确后再考虑数据错误情况。该题目的来源
我编写了一个符合要求的 C++ 函数,可以按照用户总上网时长降序返回所有用户 ID,代码如下:
```c++
#include <vector>
#include <algorithm>
#include <stdexcept>
using namespace std;
struct User_Activity {
int id; // 用户ID
int start_time; // 开始时间
int end_time; // 结束时间
};
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
vector<int> func6(const vector<User_Activity>& activities) {
// 检查输入数据是否合法
for (int i = 0; i < activities.size(); ++i) {
if (activities[i].start_time > activities[i].end_time) {
throw invalid_argument("invalid input");
}
}
for (int i = 1; i < activities.size(); ++i) {
if (activities[i].id == activities[i-1].id && activities[i].start_time < activities[i-1].end_time) {
throw invalid_argument("invalid input");
}
}
// 计算每个用户的总上网时长
vector<pair<int, int>> total_time; // 存储每个用户的总上网时长
for (int i = 0; i < activities.size(); ++i) {
bool found = false;
for (int j = 0; j < total_time.size(); ++j) {
if (total_time[j].first == activities[i].id) {
total_time[j].second += activities[i].end_time - activities[i].start_time;
found = true;
break;
}
}
if (!found) {
total_time.push_back(make_pair(activities[i].id, activities[i].end_time - activities[i].start_time));
}
}
// 按照总上网时长降序排序
sort(total_time.begin(), total_time.end(), cmp);
// 返回所有用户 ID
vector<int> result;
for (int i = 0; i < total_time.size(); ++i) {
result.push_back(total_time[i].first);
}
return result;
}
```
该函数首先检查输入数据是否合法,如果数据有误则抛出异常"invalid input"。然后计算每个用户的总上网时长,存储在 vector<pair<int, int>> 类型的 total_time 中。最后按照总上网时长降序排序,将所有用户 ID 存储在 vector<int> 类型的 result 中并返回。
阅读全文