1 条题解

  • 0
    @ 2025-7-4 21:26:22

    JAVA题解:

    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine().trim());
            
            List<Version> versions = new ArrayList<>();
            for (int i = 0; i < N; i++) {
                versions.add(parseVersion(br.readLine().trim()));
            }
            
            String req = br.readLine().trim();
            String result = findBestMatch(versions, req);
            System.out.println(result);
        }
        
        // 解析版本号字符串为Version对象
        private static Version parseVersion(String s) {
            String[] parts = s.split("\\.");
            int major = Integer.parseInt(parts[0]);
            int minor = parts.length > 1 ? Integer.parseInt(parts[1]) : 0;
            int patch = parts.length > 2 ? Integer.parseInt(parts[2]) : 0;
            return new Version(major, minor, patch);
        }
        
        // 格式化Version对象为字符串
        private static String formatVersion(Version v) {
            if (v.patch == 0) {
                if (v.minor == 0) {
                    return String.valueOf(v.major);
                }
                return v.major + "." + v.minor;
            }
            return v.major + "." + v.minor + "." + v.patch;
        }
        
        // 查找最佳匹配版本
        private static String findBestMatch(List<Version> versions, String req) {
            Version best = new Version(-1, -1, -1);
            
            if ("*".equals(req)) {
                // 找最新版本
                for (Version v : versions) {
                    if (v.compareTo(best) > 0) {
                        best = v;
                    }
                }
            } else {
                char mode = req.charAt(0);
                Version target = parseVersion(req.substring(1));
                
                for (Version v : versions) {
                    if (mode == '^') {
                        // 主版本号必须相同,且版本号不小于目标版本
                        if (v.major != target.major || v.compareTo(target) < 0) {
                            continue;
                        }
                    } else if (mode == '-' || mode == '~') {
                        // 主版本号和次版本号必须相同,且版本号不小于目标版本
                        if (v.major != target.major || v.minor != target.minor || v.compareTo(target) < 0) {
                            continue;
                        }
                    }
                    
                    if (v.compareTo(best) > 0) {
                        best = v;
                    }
                }
            }
            
            if (best.major < 0) {
                return "None";
            } else {
                return formatVersion(best);
            }
        }
        
        // 版本号类
        static class Version implements Comparable<Version> {
            int major;
            int minor;
            int patch;
            
            public Version(int major, int minor, int patch) {
                this.major = major;
                this.minor = minor;
                this.patch = patch;
            }
            
            @Override
            public int compareTo(Version other) {
                if (this.major != other.major) {
                    return Integer.compare(this.major, other.major);
                }
                if (this.minor != other.minor) {
                    return Integer.compare(this.minor, other.minor);
                }
                return Integer.compare(this.patch, other.patch);
            }
        }
    }
    
    
    
    • 1

    信息

    ID
    25
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    2
    已通过
    1
    上传者