QR15. 版本排序
描述
去哪儿前端技术团队一直很富有创新性,经常为了解决实际工作的一些痛点,自主开发一些工具,来解决这些问题。这样,工具的版本就成为了很重要的一个点,开发者如何提供正确版本,使用者如何获取正确版本,都是十分重要的。因此,版本都会遵循业界统一的规范---SemVer。常规版本规则如下:
(1) 版本格式:主版本号.次版本号.修订号,例如1.2.3,版本的三个位数都必须存在,并且为0到999之间的整数。
(2) 主版本号:当你做了不兼容的功能修改
(3) 次版本号:当你做了向下兼容的功能性新增
(4) 修订号:当你做了向下兼容的问题修正
当然,使用者不一定会指定版本号,可能使用通配符(例如***)未自动获取满足条件的最新版本。(在本题中,只考虑这种情况表示匹配任意版本例如2.2.*,可以匹配所有2.2.1,2.2.2等;)
现在会给出一个版本列表,并给出使用者的匹配规则,找出符合版本规则而且满足条件的最新版本,并输出,如果没有找到相应结果,则输出0.
输入描述
输入第一行是一个整数N,之下N(0<N≤10000)行为版本号,之后一行使用者的匹配规则M(只包含数字或者*的版本,而且也是三位)。输出描述
输出符合版本规则而且满足条件的最新版本,并输出,如果没有找到相应结果,则输出0.示例1
输入:
5 2.1.4 2.5.7 3.4.6 2.1.8 2.1.0 2.1.*
输出:
2.1.8
C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2020-11-01
#include"cstdio" #include<iostream> #include<string> #include<vector> using namespace std; struct Version { int x[3]; Version &operator = (const Version &rhs) { for (int i = 0; i < 3; i++) { this->x[i] = rhs.x[i]; } return *this; } }; bool operator<(const Version &lhs, const Version &rhs) { for (int i = 0; i < 3; i++) { if (lhs.x[i] != rhs.x[i]) { return lhs.x[i] < rhs.x[i]; } } return false; } bool match(const Version &t, const Version &s) { for (int i = 0; i < 3; i++) { if (t.x[i] != -1 && t.x[i] != s.x[i]) return false; } return true; } int main() { int n; scanf("%d", &n); vector<Version> a(n); for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &a[i].x[j]); getchar(); } } string s; cin >> s; Version t; size_t idx = 0; for (int i = 0; i < 3; i++) { if (s[0] == '*') { t.x[i] = -1; if (i < 2) { s = s.substr(2); } }else { t.x[i] = std::stoi(s, &idx, 10); if (i < 2) { s = s.substr(idx + 1); } } } Version res = { -1,-1,-1 }; for (const Version &x : a) { if (match(t, x)) { if (res.x[0] == -1 || res < x) { res = x; } } } if (res.x[0] == -1) { cout << 0 << endl; } else { cout << res.x[0] << "." << res.x[1] << "." << res.x[2] << endl; } return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2020-10-31
#include"cstdio" #include<iostream> #include<string> #include<vector> using namespace std; struct Version { int x[3]; Version &operator = (const Version &rhs) { for (int i = 0; i < 3; i++) { this->x[i] = rhs.x[i]; } return *this; } }; bool operator<(const Version &lhs, const Version &rhs) { for (int i = 0; i < 3; i++) { if (lhs.x[i] != rhs.x[i]) { return lhs.x[i] < rhs.x[i]; } } return false; } bool match(const Version &t, const Version &s) { for (int i = 0; i < 3; i++) { if (t.x[i] != -1 && t.x[i] != s.x[i]) return false; } return true; } int main() { int n; scanf("%d", &n); vector<Version> a(n); for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &a[i].x[j]); getchar(); } } string s; cin >> s; Version t; size_t idx = 0; for (int i = 0; i < 3; i++) { if (s[0] == '*') { t.x[i] = -1; if (i < 2) { s = s.substr(2); } }else { t.x[i] = std::stoi(s, &idx, 10); if (i < 2) { s = s.substr(idx + 1); } } } Version res = { -1,-1,-1 }; for (const Version &x : a) { if (match(t, x)) { if (res.x[0] == -1 || res < x) { res = x; } } } if (res.x[0] == -1) { cout << 0 << endl; } else { cout << res.x[0] << "." << res.x[1] << "." << res.x[2] << endl; } return 0; }