2023华为OD机试真题-获取最大软件版本号(JAVA、Python、C++)

题目描述:
Maven版本号定义,<主版本>.<次版本>.<增量版本>-<里程碑版本>,举例3.1.4-beta
其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。
<主版本>.<次版本>.<增量版本>:基于数字比较
里程碑版本:基于字符串比较,采用字典序
比较版本号时,按从左到右的顺序依次比较。基于数字比较, 只需比较忽略任何前导零后的整数值 。
输入2个版本号,输出最大版本号
输入描述:
输入2个版本号,换行分割,每个版本的最大长度小于50
输出描述:
版本号相同时输出第一个输入版本号

补充说明:
主版本,次版本,增量版本:基于字符串比较,比如
1.5>1.4>1.3.11>1.3.9
里程碑版本:基于字符串比较 比如
1.2-beta-3>1.2-beta-11
 收起
示例1
输入:
2.5.1-C
1.4.2-D
输出:
2.5.1-C
说明:
主版本,数字2大于1
示例2
输入:
1.3.11-S2
1.3.11-S13
输出:
1.3.11-S2
说明:
里程碑版本,S2大于S13
示例3
输入:
1.05.1
1.5.01
输出:
1.05.1
说明:
版本号相同,输出第一个版本号
示例4
输入:
1.5
1.5.0
输出:
1.5.0
说明:
主次相同,存在增量版本大于不存在
示例5
输入:
1.5.1-A
1.5.1-a
输出:
1.5.1-a
说明:
里程碑版本号,字符串比较a大于A

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s1 = in.nextLine();
        String s2 = in.nextLine();
 
        String[] s1Split = getS(s1);
        String[] s2Split = getS(s2);
 
        if (comp(s1Split, s2Split) == 1) {
            System.out.println(s1);
        } else {
            System.out.println(s2);
        }
    }
 
    private static int comp(String[] s1Split, String[] s2Split) {
        if (Integer.parseInt(s1Split[0]) > Integer.parseInt(s2Split[0])) {
            return 1;
        } else if (Integer.parseInt(s1Split[0]) < Integer.parseInt(s2Split[0])) {
            return 2;
        }
 
        if (Integer.parseInt(s1Split[1]) > Integer.parseInt(s2Split[1])) {
            return 1;
        } else if (Integer.parseInt(s1Split[1]) < Integer.parseInt(s2Split[1])) {
            return 2;
        }
 
        if (s1Split[2] == null && s2Split[2] == null) {
            return 1;
        } else if (s1Split[2] != null && s2Split[2] == null) {
            return 1;
        } else if (s1Split[2] == null && s2Split[2] != null) {
            return 2;
        } else if (Integer.parseInt(s1Split[2]) > Integer.parseInt(s2Split[2])) {
            return 1;
        } else if (Integer.parseInt(s1Split[2]) < Integer.parseInt(s2Split[2])) {
            return 2;
        }
 
        if (s1Split[3] == null && s2Split[3] == null) {
            return 1;
        } else if (s1Split[3] != null && s2Split[3] == null) {
            return 1;
        } else if (s1Split[3] == null && s2Split[3] != null) {
            return 2;
        } else {
            if (s1Split[3].compareTo(s2Split[3]) > 0) {
                return 1;
            } else if (s1Split[3].compareTo(s2Split[3]) < 0) {
                return 2;
            } else {
                return 1;
            }
        }
 
    }
 
    private static String[] getS(String s1) {
        String[] res = new String[4];
 
        String[] split2 = s1.split("-");
 
        String[] split = split2[0].split("\\.");
        for (int i = 0; i < split.length; i++) {
            res[i] = split[i];
        }
 
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < split2.length; i++) {
            sb.append(split2[i]).append("-");
        }
        if (sb.length() != 0) {
            sb.deleteCharAt(sb.length() - 1);
            res[3] = sb.toString();
        }
 
 
        return res;
 
    }
}
import re
 
def split(v):
    list1 = re.split('[.-]', v)
    for i in range(len(list1)):
        if i < 3:
            if list1[i] == '0':
                list1[i] = 0
            else:
                list1[i] = int(list1[i].lstrip('0'))
    return list1
 
v1 = input()
v2 = input()
list1 = split(v1)
list2 = split(v2)
# print(list1, list2)
i = 0
l1 = len(list1)
l2 = len(list2)
for i in range(4):
    if l1 < i + 1 or l2 < i + 1:
        if l1 != l2:
            max_v = v1 if l1 > l2 else v2
            print(max_v)
        else:
            print(v1)
            break
    if list1[i] > list2[i]:
        print(v1)
        break
    elif list1[i] < list2[i]:
        print(v2)
        break
#include<iostream>
#include<vector>
#include<map>
#include<unordered_set>
using namespace std;
vector<int> parse(string s){
    vector<int> ans;
    string a="";
    for(char r:s){
        if(r!='.'){
            a.push_back(r);
        }else{
            ans.push_back(stoi(a));
            a="";
        }
    }
    bool flag = false;
    string b="";
    for(auto r:a){
        if(r!='-'){
            b.push_back(r);
        }else{
            ans.push_back(stoi(b));
            return ans;
            b="";
        }
    }
    ans.push_back(stoi(b));
    return ans; 
}
string getVersion(string& s){
    string b;
    for(auto r:s){
        if(r!='-'){
            b.push_back(r);
        }else{
            b="";
        }
    }
    if(b==s) return "";
    return b; 
}
 
string getBigger(string& s1,string &s2){
    vector<int> v1=parse(s1);
    vector<int> v2=parse(s2);
    int len = min(v1.size(),v2.size());
    for(int i=0;i<len;i++){
        if(v1[i]>v2[i]){
            return s1;
        }else if(v1[i]<v2[i]){
            return s2;
        }
    }
    if(v1.size()>v2.size()) return s1;
    else if(v1.size()<v2.size()) return s2;
    string version1 = getVersion(s1);
    string version2 = getVersion(s2);
    if(version1>=version2) return s1;
    return s2;
}
int main(){
    string data1;
        char a;
        while(cin.get(a)){
            if(a=='\n') break;
            data1.push_back(a); 
        }
    string data2;
    while(cin.get(a)){
            if(a=='\n') break;
            data2.push_back(a); 
        }
    string ans = getBigger(data1,data2);
    cout<<ans<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值