列表

详情


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;
}

上一题