个人认为,这道题想考查的是字符串的大小比较。我一开始看到这道题的题目的时候,留心了一下,发现题目说版本号中的每一节有可能超过 int 范围,那不用说,int 肯定是用不了了。我就尝试了一下使用 Long 类型的,发现一样不行。然后,我就尝试上网搜索能够有更大的存储类型存储这么一长串的整数。搜索过程中,我才明白,方向错了,题目考察的是如何比较两个字符串的大小。

import java.util.ArrayList;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串 
     * @param version2 string字符串 
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        // 将 String 按照 '.' 进行分割
        String[] v1s = version1.split("\\.");
        String[] v2s = version2.split("\\.");
        // 定义两个 String 类型的 ArrayList
        ArrayList<String> v1a = new ArrayList<>();
        ArrayList<String> v2a = new ArrayList<>();
        // 将 String 类型的数组转换为 String 类型的 ArrayList
        for (String v : v1s) { // 转换 version1
            v1a.add(v);
        }
        for (String v : v2s) { // 转换 version2
            v2a.add(v);
        }
        // 获取 version1 和 version2 的长度
        int v1l = v1a.size();
        int v2l = v2a.size();
        // 判断谁的长度短,然后在短的那一方的末尾添加 0
        if (v1l < v2l) { // 如果 version1 短,那么就在 version1 的末尾添加 0
            while (v1a.size() != v2l) {
                v1a.add(0 + "");
            }
        }
        else if (v1l > v2l) { // 如果 version2 短,那么就在 version2 的末尾添加 0
            while (v2a.size() != v1l) {
                v2a.add(0 + "");
            }
        }
        // 此时,version1 的长度和 version2 的长度终于一样了,我们可以进行比较了
        for (int i = 0; i < v1a.size(); i++) {
            if (1 == compareString(v1a.get(i), v2a.get(i))) { // 如果 version1 当前位置比 version2 大,直接返回 1
                return 1;
            }
            else if ((-1) == compareString(v1a.get(i), v2a.get(i))) { // 如果 version1 当前位置比 version2 小,直接返回 -1
                return -1;
            }
        }
        // 如果 version1 和 version2 一样大,返回 0
        return 0;
    }
    
    // 自定义一个方法,用来比较两个字符串谁大
    public int compareString(String version1, String version2) {
        // 定义两个指针,分别指向 version1 和 version2 的头部
        int v1p = 0;
        int v2p = 0;
        // 定义两个 String 类型的变量,用于存放最终需要进行比较的字符串
        String v1 = null;
        String v2 = null;
        // 将字符串头部为 0 的部分全部切割出去
        while (v1p < version1.length() && version1.charAt(v1p) == '0') { // 对 version1 进行此操作
            v1p++;
        }
        if (v1p == version1.length()) { // 如果 version1 中全部都是 0
            v1 = "0";
        }
        else { // 否则,将头部为 0 的部分全部切除出去
            v1 = version1.substring(v1p, version1.length());
        }
        while (v2p < version2.length() && version2.charAt(v2p) == '0') { // 对 version2 进行此操作
            v2p++;
        }
        if (v2p == version2.length()) {
            v2 = "0";
        }
        else {
            v2 = version2.substring(v2p, version2.length());
        }
        // 判断 version1 和 version2 的长度
        if (v1.length() > v2.length()) { // 如果 version1 的长度大,那么直接返回 1
            return 1;
        }
        else if (v1.length() < v2.length()) { // 如果 version2 的长度大,那么直接返回 -1
            return -1;
        }
        else { // 如果两者的长度相等,那么就要按照字典序进行比较,从左往右进行遍历
            for (int i = 0; i < v1.length(); i++) {
                if (v1.charAt(i) > v2.charAt(i)) {
                    return 1;
                }
                else if (v1.charAt(i) < v2.charAt(i)) {
                    return -1;
                }
            }
            return 0;
        }
    }
}