题目描述
Maven 版本号定义,<主版本>.<次版本>.<增量版本>-<里程碑版本>,举例3.1.4-beta
其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。
<主版本>.<次版本>.<增量版本>:基于数字比较;
里程碑版本:基于字符串比较,采用字典序;
比较版本号时,按从左到右的顺序依次比较。
基于数字比较, 只需比较忽略任何前导零后的整数值 。
输入2个版本号,输出最大版本号。
输入描述
输入2个版本号,换行分割,每个版本的最大长度小于50
输出描述
版本号相同时输出第一个输入版本号
用例
输入 | 2.5.1-C 1.4.2-D |
输出 | 2.5.1-C |
说明 | 无 |
输入 |
1.05.1 |
输出 | 1.05.1 |
说明 | 版本号相同,输出第一个版本号 |
输入 | 1.5 1.5.0 |
输出 | 1.5.0 |
说明 | 主次相同,存在增量版本大于不存在 |
输入 | 1.5.1-A 1.5.1-a |
输出 | 1.5.1-a |
说明 | 里程碑版本号,基于字典序比较,a 大于 A |
题目解析
简单排序题,考察数组排序
本题和
类似,做完本题,可以再试试上面这个真题
2022.12.20 补充
这题看走眼了。
题目中说:“主版本和次版本都是必须的”,也就说后面几个版本可能是没有的,因此如下正则表达式:const regExp = /^(d+).(d+).(d+)-(.+)$/;
获取缺失了增量版本和里程碑版本的字符串时,是存在问题的。
这里更新了下正则
const reg = /^(d+)(.(d+))(.(d+))?(-.+)?$/;
在增量版本捕获组后面加了?,以及在里程碑版本后面加了?,表示这两个版本可以没有。
同时为了直到缺失的增量版本,还是里程碑版本,我们需要将"." 和 “-” 加入捕获组中,来帮助我们辨别。
最终效果如下:
需要注意的是捕获组的顺序就是正则中括号从左到右的顺序,比如
字符串操作解法
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
System.out.println(getResult(s1, s2));
}
public static String getResult(String s1, String s2) {
String[] v1 = getVersion(s1);
String[] v2 = getVersion(s2);
/*
* 主要版本比较
* */
int major1 = Integer.parseInt(v1[0]), major2 = Integer.parseInt(v2[0]);
if (major1 > major2) return s1;
else if (major1 < major2) return s2;
/*
* 次要版本比较
* */
int minor1 = Integer.parseInt(v1[1]), minor2 = Integer.parseInt(v2[1]);
if (minor1 > minor2) return s1;
else if (minor1 < minor2) return s2;
/*
* 增量版本比较
* */
String patch1 = v1[2], patch2 = v2[2];
if (!"".equals(patch1) || !"".equals(patch2)) {
if ("".equals(patch2)) return s1;
else if ("".equals(patch1)) return s2; // 走到这步,s2的增量版本确定不是空串,则如果只有s1的增量版本是空串,则返回s2
// 走到此步,说明s1,s2的增量版本都不是空串,此当成数字进行比较
int v1_patch = Integer.parseInt(patch1);
int v2_patch = Integer.parseInt(patch2);
if (v1_patch > v2_patch) return s1;
else if (v1_patch < v2_patch) return s2;
}
/*
* 里程碑版本比较
* */
String mile1 = v1[3], mile2 = v2[3];
// s1,s2的里程碑的空串判断,同增量版本
if ("".equals(mile2)) {
return s1;
} else if ("".equals(mile1)) {
return s2;
}
// 如果s1,s2的里程碑版本都不是空串,则按照字典序比较
return mile1.compareTo(mile2) >= 0 ? s1 : s2;
}
public static String[] getVersion(String s) {
String major = "";
String minor = "";
String patch = "";
String mile = "";
// 找到第一个“-”,先把里程碑解析出来,因为里程碑中可能含有"-"和".",因此必须先处理掉
int i = s.indexOf("-");
String major_minor_patch = "";
if (i != -1) {
mile = s.substring(i + 1);
major_minor_patch = s.substring(0, i);
} else {
major_minor_patch = s;
}
// 之后再处理非里程碑部分
String[] split = major_minor_patch.split("\.");
major = split[0];
minor = split[1];
if (split.length > 2) {
patch = split[2];
}
return new String[] {major, minor, patch, mile};
}
}
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 2) {
console.log(getResult(lines[0], lines[1]));
lines.length = 0;
}
});
function getResult(s1, s2) {
const [major1, minor1, patch1, mile1] = getVersion(s1);
const [major2, minor2, patch2, mile2] = getVersion(s2);
if (major1 > major2) return s1;
else if (major1 < major2) return s2;
if (minor1 > minor2) return s1;
else if (minor1 < minor2) return s2;
/**
* 注意下面JS判断与空串是否相同时,必须要使用===,不能使用==,因为 0 == "" 为true
*/
if (patch1 !== "" || patch2 !== "") {
if (patch2 === "") {
return s1;
} else if (patch1 === "") {
return s2;
}
// 走到此步,说明s1,s2的增量版本都不是空串,此当成数字进行比较
if (patch1 > patch2) {
return s1;
} else if (patch1 < patch2) {
return s2;
}
}
// s1,s2的里程碑的空串判断,同增量版本
if (mile2 === "") {
return s1;
} else if (mile1 === "") {
return s2;
}
// 如果s1,s2的里程碑版本都不是空串,则按照字典序比较
return mile1 >= mile2 ? s1 : s2;
}
function getVersion(s) {
let major = "";
let minor = "";
let patch = "";
let mile = "";
// 找到第一个“-”,先把里程碑解析出来,因为里程碑中可能含有"-"和".",因此必须先处理掉
const i = s.indexOf("-");
let major_minor_pathc = "";
if (i != -1) {
mile = s.slice(i + 1);
major_minor_pathc = s.slice(0, i);
} else {
major_minor_pathc = s;
}
// 之后再处理非里程碑部分
const tmp = major_minor_pathc.split(".");
major = Number(tmp[0]);
minor = Number(tmp[1]);
if (tmp.length > 2) {
patch = Number(tmp[2]);
}
return [major, minor, patch, mile];
}
Python算法源码
# 输入获取
s1 = input()
s2 = input()
# 解析版本号字符串s
def getVersion(s):
patch = ""
mile = ""
i = s.find("-")
# 找到第一个“-”,先把里程碑解析出来,因为里程碑中可能含有"-"和".",因此必须先处理掉
major_minor_patch = ""
if i != -1:
mile = s[i + 1:]
major_minor_patch = s[0:i]
else:
major_minor_patch = s
# 之后再处理非里程碑部分
tmp = major_minor_patch.split(".")
major = int(tmp[0])
minor = int(tmp[1])
if len(tmp) > 2:
patch = int(tmp[2])
return major, minor, patch, mile
# 算法入口
def getResult(s1, s2):
major1, minor1, patch1, mile1 = getVersion(s1)
major2, minor2, patch2, mile2 = getVersion(s2)
if major1 > major2:
return s1
elif major1 < major2:
return s2
if minor1 > minor2:
return s1
elif minor1 < minor2:
return s2
if patch1 != "" or patch2 != "":
if patch2 == "":
return s1
elif patch1 == "":
return s2
# 走到此步,说明s1,s2的增量版本都不是空串,此当成数字进行比较
if patch1 > patch2:
return s1
elif patch1 < patch2:
return s2
# s1,s2的里程碑的空串判断,同增量版本
if mile2 == "":
return s1
elif mile1 == "":
return s2
# 如果s1,s2的里程碑版本都不是空串,则按照字典序比较
return s1 if mile1 >= mile2 else s2
# 算法调用
print(getResult(s1, s2))
正则解法
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 2) {
console.log(getResult(lines));
lines.length = 0;
}
});
function getResult(versions) {
const reg = /^(d+)(.(d+))(.(d+))?(-.+)?$/;
return versions.sort((v1, v2) => {
let [_1, major1, _11, minor1, _111, patch1, mile1] = reg.exec(v1);
let [_2, major2, _22, minor2, _222, patch2, mile2] = reg.exec(v2);
major1 = Number(major1);
major2 = Number(major2);
if (major1 !== major2) return major2 - major1;
minor1 = Number(minor1);
minor2 = Number(minor2);
if (minor1 !== minor2) return minor2 - minor1;
if (patch1 !== undefined && patch2 !== undefined) {
patch1 = Number(patch1);
patch2 = Number(patch2);
if (patch1 !== patch2) return patch2 - patch1;
} else if (patch1 !== undefined && !patch2) {
return -1;
} else if (patch2 !== undefined && !patch1) {
return 1;
}
if (mile1 && mile2) {
return mile1 === mile2 ? 0 : mile2 > mile1 ? 1 : -1;
} else if (mile1 && !mile2) {
return -1;
} else if (!mile1 && mile2) {
return 1;
} else {
return 0;
}
})[0];
}
Java算法源码
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
System.out.println(getResult(new String[]{str1, str2}));
}
public static String getResult(String[] versions) {
String reg = "^(\d+)(\.(\d+))(\.(\d+))?(\-.+)?$";
Pattern p = Pattern.compile(reg);
Arrays.sort(versions, (v1, v2) -> {
Matcher m1 = p.matcher(v1);
Matcher m2 = p.matcher(v2);
if (m1.find() && m2.find()) {
Integer major1 = Integer.parseInt(m1.group(1));
Integer major2 = Integer.parseInt(m2.group(1));
if(major1 != major2) return major2 - major1;
Integer minor1 = Integer.parseInt(m1.group(3));
Integer minor2 = Integer.parseInt(m2.group(3));
if(minor1 != minor2) return minor2 - minor1;
String patch1 = m1.group(5);
String patch2 = m2.group(5);
if(patch1 != null && patch2 != null) {
int patch1_intVal = Integer.parseInt(patch1);
int patch2_intVal = Integer.parseInt(patch2);
if(patch1_intVal != patch2_intVal) {
return Integer.parseInt(patch2) - Integer.parseInt(patch1);
}
} else if(patch1 != null) {
return -1;
} else if(patch2 != null) {
return 1;
}
String mile1 = m1.group(6);
String mile2 = m2.group(6);
if(mile1 != null && mile2 != null) {
return mile2.compareTo(mile1);
} else if(mile1 != null) {
return -1;
} else if(mile2 != null) {
return 1;
} else {
return 0;
}
}
return 0;
});
return versions[0];
}
}
Python算法源码
import re
# 输入获取
v1 = input()
v2 = input()
# 算法入口
def getResult(v1, v2):
pattern = r"^(d+)(?:.(d+))(?:.(d+))?(?:-(.+))?$"
major1, minor1, patch1, mile1 = re.findall(pattern, v1)[0]
major2, minor2, patch2, mile2 = re.findall(pattern, v2)[0]
if major1 != major2:
if int(major1) > int(major2):
return v1
else:
return v2
if int(minor1) != int(minor2):
if int(minor1) > int(minor2):
return v1
else:
return v2
if patch1 != patch2:
if patch1 != "" and patch2 != "":
if int(patch1) > int(patch2):
return v1
elif int(patch1) < int(patch2):
return v2
elif patch1 != "" and patch2 == "":
return v1
elif patch1 == "" and patch2 != "":
return v2
if mile1 != mile2:
if mile1 != "" and mile2 != "":
if mile1 > mile2:
return v1
elif mile1 < mile2:
return v2
elif mile1 != "" and mile2 == "":
return v1
elif mile1 == "" and mile2 != "":
return v2
return v1
# 算法调用
print(getResult(v1, v2))
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0