数组 - [165.比较版本号]

数组 - 165.比较版本号

比较两个版本号 version1 和 version2。

如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0

你可以假设版本字符串非空,并且只包含数字和 . 字符。

. 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 34。其第三级和第四级修订号均为 0

示例 1:

输入: version1 = "0.1", version2 = "1.1"
输出: -1

示例 2:

输入: version1 = "1.0.1", version2 = "1"
输出: 1

示例 3:

输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1

示例 4:

输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。

示例 5:

输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。

提示

版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
版本字符串不以点开始或结束,并且其中不会有两个连续的点。

一.实现思路

分割点构建数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JSKp5bmT-1579584783720)(en-resource://database/8855:0)]

  1. 分割点构建数组
  2. 遍历最长的那个数组
    1. 设置一个bigsize和一个smallsize
  3. 一次遍历,按照顺序比较。时间负责度为 O(n)
  4. 如果前面都是相等,一直到i大于小的数组的长度,则看大的数组是否为0,不为0则长的那个大

char数组遍历

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3K7S3hwi-1579584783723)(en-resource://database/8857:0)]

  1. 将字符串转换为char数组
  2. 创建stringbuilder作为存储单个元素(。与。之间的char)
  3. 然后循环比较

这个比上面那种方法效率高主要是由于string的split方法耗时,用正则进行切割,速度会比较慢

使用byte构建数值比较大小

和上面版本差不多,但是优化为了byte比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FV3gEA5T-1579584783723)(en-resource://database/8859:0)]

二.代码实现

分割点构建数组

public class Solution {
    
    int bigSize ;
    int smallSize;
    boolean flag;
    public int compareVersion(String version1, String version2) {
        String[] version1List = version1.split("\\.");
        String[] version2List = version2.split("\\.");
        bigSize =version2List.length ;
        smallSize=version1List.length;
        if (bigSize<smallSize){
            int t = bigSize;
            bigSize = smallSize;
            smallSize = t;
            flag=true;
        }
        for (int i = 0; i < bigSize; i++) {
            if (i>=smallSize){
                if (!flag&&Integer.parseInt(version2List[i])>0){
                    return -1;
                } else if (flag&&Integer.parseInt(version1List[i])>0){
                    return 1;
                }
                continue;
            }
            if (Integer.parseInt(version1List[i])==Integer.parseInt(version2List[i])) {
                continue;
            }else if (Integer.parseInt(version1List[i])>Integer.parseInt(version2List[i])) {
                return 1;
            }else {
                return -1;
            }
        }
        return 0;
    }
}

char数组遍历

public class Solution {
    
    public int compareVersion(String version1, String version2) {
        char[] bArr1 = version1.toCharArray();
        char[] bArr2 = version2.toCharArray();
 
        int index1 = 0;
        int index2 = 0;

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();

        while (index1 < bArr1.length || index2 < bArr2.length) {
            for (int i = index1; i < bArr1.length; i++) {
                if (bArr1[i] == '.') {
                    index1 = ++i;
                    break;
                }
                sb1.append(bArr1[i]);
                index1 = i +1;
            }
 
 
            for (int j = index2; j < bArr2.length; j++) {
                if (bArr2[j] == '.') {
                    index2 = ++j;
                    break;
                }
                sb2.append(bArr2[j]);
                index2 = j+1;
            }
 
            Integer b1 = sb1.length()==0?0:Integer.parseInt(sb1.toString());
            Integer b2 = sb2.length()==0?0:Integer.parseInt(sb2.toString());
 
 
            if (b1 > b2) {
                return 1;
            }
 
            if (b1 < b2) {
                return -1;
            }
 
            sb1.setLength(0);
            sb2.setLength(0);
 
        }
        return 0;
    }
}

使用byte构建数值比较大小


public int compareVersion(String version1, String version2) {
     //取值游标位置索引
     int index1 = 0;
     int index2 = 0;
 
     while (index1 < version1.length() || index2 < version2.length()) {
         int b1 = 0;
         for (int i = index1; i < version1.length(); i++) {
             // 46 为 .的byte值
             if (version1.charAt(i) == 46) {
                 index1 = ++i;
                 break;
             }
             // 48 为 0的byte值: 减去48为了使值小于10(前面乘10就可以了)
             b1 = b1 * 10 + (version1.charAt(i) - 48);
             index1 = i + 1;
         }
 
         int b2 = 0;
         for (int j = index2; j < version2.length(); j++) {
             if (version2.charAt(j) == 46) {
                 index2 = ++j;
                 break;
             }
             b2 = b2 * 10 + (version2.charAt(j) - 48);
             index2 = j + 1;
         }
 
         if (b1 > b2) {
             return 1;
         }
 
         if (b1 < b2) {
             return -1;
         }
 
     }
     return 0;
 }


发布了96 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq919694688/article/details/104061080