leetcode【165】【tag string】Compare Version Numbers【c++版本,时间空间100%】

问题描述:

Compare two version numbers version1 and version2.
If version1 > version2 return 1; if version1 < version2 return -1;otherwise return 0.

You may assume that the version strings are non-empty and contain only digits and the .character.

The . character does not represent a decimal point and is used to separate number sequences.

For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.

You may assume the default revision number for each level of a version number to be 0. For example, version number 3.4 has a revision number of 3 and 4 for its first and second level revision number. Its third and fourth level revision number are both 0.

 

Example 1:

Input: version1 = "0.1", version2 = "1.1"
Output: -1

Example 2:

Input: version1 = "1.0.1", version2 = "1"
Output: 1

Example 3:

Input: version1 = "7.5.2.4", version2 = "7.5.3"
Output: -1

Example 4:

Input: version1 = "1.01", version2 = "1.001"
Output: 0
Explanation: Ignoring leading zeroes, both “01” and “001" represent the same number “1”

Example 5:

Input: version1 = "1.0", version2 = "1.0.0"
Output: 0
Explanation: The first version number does not have a third level revision number, which means its third level revision number is default to "0"

 

Note:

  1. Version strings are composed of numeric strings separated by dots . and this numeric strings may have leading zeroes.
  2. Version strings do not start or end with dots, and they will not be two consecutive dots.

源码:

这题麻烦的就是考虑的因素太多了。试了很多次才过关。

我的主体思想是,每次取出两个圆点之间的子串比较,子串的大小可以作为全局的大小;

如果一直相同:最后如果哪个串有多余的元素,并且该多余元素不是仅仅由0和点组成,就是多出来的大。

如果到最后,全相等,或者长串多出来的只有'.'开头的0和'.',那么返回0.

写的很搓,因为今天有点事,后面我会继续学习大佬的做法给大家展示,今天就先写我自己写的cuo方法:

时间100%,空间100%

class Solution {
public:
    int compare(string num1, string num2){
        int i=0, j=0, len1=num1.length(), len2 = num2.length();
        while(num1[i] == '0')      i++;
        while(num2[j] == '0')      j++;
        if (len1-i > len2-j)     return 1;
        else if (len1-i < len2-j)   return -1;
        while(i<len1 && j<len2){
            if (num1[i] > num2[j])   return 1;
            else if (num1[i] < num2[j])   return -1;
            i++;    j++;
        }
        return 0;
    }
    
    int compareVersion(string version1, string version2) {
        int len1 = version1.length(), len2 = version2.length();
        int i=0, j=0;
        while(version1[i] == '0')   i++;
        while(version2[j] == '0')   j++;
        while (i<len1 && j<len2){
            int tmp_i=i, tmp_j=j;
            while(version1[i] != '.' && i<len1)   i++;
            while(version2[j] != '.' && j<len2)   j++;
            int flag = compare(version1.substr(tmp_i, i-tmp_i), version2.substr(tmp_j, j-tmp_j));
            if(flag == 1)   return 1;
            else if(flag == -1)     return -1;
            if(i==len1 || j==len2)      break;
            i++;
            j++;
        }
        if (i<len1 && j>=len2){
            if (version1[i] == '.'){
                i++;
                while(version1[i] == '.' || version1[i] == '0'){
                    if(i == len1-1)      return 0;
                    i++;
                }
            }
            return 1;
        }
        if (i>=len1 && j<len2){
            if (version2[j] == '.'){
                j++;
                while(version2[j] == '.' || version2[j] == '0'){
                    if(j == len2-1)      return 0;
                    j++;
                }
            }
            return -1;
        }
        return 0;
    }
};

网上大佬的解法,思路大体相同,代码简洁了很多。但是我没想到可以用int来表示各个字串,其实这样是不合理的,万一输入用例的子串大的int存不下呢?所以我想这是leetcode输入测试不完善。

时间空间同样是100%。

class Solution {
public:
    int compareVersion(string version1, string version2) {
        int len1 = version1.length(), len2 = version2.length();
        int i=0, j=0;
        while (i<len1 || j<len2){
            int num1=0, num2=0;
            while(version1[i] != '.' && i<len1){
                num1 = num1*10 + (version1[i++]-'0');
            }
            while(version2[j] != '.' && j<len2){
                num2 = num2*10 + (version2[j++]-'0');
            }
            if(i<len1)  i++;
            if(j<len2)  j++;
            if (num1 == num2)       continue;
            else if (num1 > num2)     return 1;
            else if (num1 < num2)   return -1;
        }
        return 0;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值