比较版本号字符串

Posted

技术标签:

【中文标题】比较版本号字符串【英文标题】:Compare version number strings 【发布时间】:2019-09-17 11:15:46 【问题描述】:

“以下是我正在尝试的问题的链接。

https://www.interviewbit.com/problems/compare-version-numbers/

我模拟了数组来比较两个版本。但我在代码中找不到任何错误。”

 int compareVersion(string A, string B) 

//vnum1,vnum2存储版本A和B的每个数字部分

      long long int vnum1 = 0, vnum2 = 0; 

// 循环直到两个字符串都处理完

    //  storing numeric part of version A in vnum1 
    int i=0,j=0;
    while(i<A.length()||j<B.length())


    while (i < A.length()&&A[i]!='.') 
        
        vnum1 = vnum1 * 10 + (A[i]-'0'); 
        i++; 
     

    //  storing numeric part of version B in vnum2 
    while (j < B.length()&&B[j]!='.') 
     
        vnum2 = vnum2 * 10 + (B[j] - '0'); 
        j++; 
     

    if (vnum1 > vnum2) 
        return 1; 
   else  if (vnum2 > vnum1) 
        return -1; 

    //  if equal, reset variables and go for next numeric 

    vnum1=0;
    vnum2=0;
    i++;
    j++;

     return 0; 
   

输入

A="444444444444444444444444"
B="4444444444444444444444444"

实际

 1

预期

-1

【问题讨论】:

我做了同样的事情,但给定的输入它没有按预期工作。 【参考方案1】:

将版本号视为以点分隔的字符串。从每个输入字符串中获取第一个并进行比较。如果它们不相等,你可以立即返回结果,否则你会得到下一个点分隔的数字,依此类推,直到你到达字符串的末尾。

std::istringstreamstd::getlinestd::stoll 可以帮助您。


如果版本号可以是任意长度,您仍然可以将其视为以点分隔的输入,并使用std::istringstreamstd::getline 将数字提取为字符串。但是,与其将它们转换为可以比较的整数,不如逐个字符地检查。

首先从字符串中去除前导零(例如,"01" 变为 "1")。然后比较字符串的长度。较长的字符串总是会更大。

一旦你过了那个阶段,获取最低有效数字(字符串中的最后一个字符)并进行简单的字符比较(C++ 规范有这样的措辞,即字​​符 '1' 将始终小于字符'2')。只要字符相等,您就可以向后迭代字符串,逐个字符进行比较。

【讨论】:

以上是关于比较版本号字符串的主要内容,如果未能解决你的问题,请参考以下文章

iOS 比较版本号大小的方法

js 比较版本号

165.比较版本号

软件版本号比较(字符串比较)

比较版本号字符串

Leetcode——比较版本号